C# - Problemă DataGridView


(Tudor) #1

Am creat un dataGridView în care afișez meniul unui restaurant. Datele le încarc automat din baza de date. Pe lângă coloanele din baza de date am mai adăugat 2 coloane (coloana Cantitate și Adaugă)

Problema este că nu pot scrie în căsuța Cantitate.

Plus, am încercat să inițializez valoarea pe coloana Cantitate de pe fiecare rând cu 1 și nu am reușit.

int value = 1;

for (int i = 1; i <= dataGridView1.SelectedRows.Count; i++)
      dataGridView1.Rows[i].Cells[6].Value = value;

(mrapi) #2

Eu as scrie in sursa de date la care este legat controlul (datatable),nu in control.


(Tudor) #3

Eu nu am in tabela, coloana Cantitate. E adaugata doar in dataGridView.


(mrapi) #4

cum ai conectat gridul la sura de date?poti pune ceva cod


(Tudor) #5

N-am scris linie de cod :slight_smile:

Conectarea e făcuă direct din setările dataGridView-ului.


(Adrian Stanculescu) #6

Ai setat coloana ca readonly?
https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcolumn.readonly(v=vs.110).aspx


(Tudor) #7

Nu.


(mrapi) #8

Eu as face prin cod,un sql in care aduci si campul cantiatate cu o valoare default, il legi apoi la grid (il scrii in coloana DataPropertyName)
uite si putin cod,am creat un datatable,tu vei face o interogare SQL si inlocuiesti codul marcat cu temporar,apoi am parcurs acel datatable si am schimbat cantitatea din 1 in 2,gridul l-am legat din cod la sursa : dataGridView1.DataSource = dt;

     private void Form1_Load(object sender, EventArgs e)
    {
        //temporar
        var dt =new DataTable();
        dt.Columns.Add("id", typeof(int));
        dt.Columns.Add("denumire", typeof(string));
        dt.Columns.Add("cantitate", typeof(string));

        var row =dt.NewRow();
        row["id"] = 1;
        row["denumire"] = "Atricol 1";
        row["cantitate"] = 1;
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["id"] = 2;
        row["denumire"] = "Atricol 2";
        row["cantitate"] = 1;
        dt.Rows.Add(row);
        //end temporar

        foreach (DataRow r in dt.Rows)
        {
            r["cantitate"] = 2;
        }

        dataGridView1.DataSource = dt;
    }

(cosmos) #9

Porneste cu for ul de la 0 pana la dataGridView1.SelectedRows.Count

for(int i = 0; i< dataGridView1.SelectedRows.Count; i++)

Tu incepi for ul de la 1, dar datagridul inecepe de la 0

sai poti sa modifici la indexul coloaneo cu 7
Este a 7 coloana din grid

Vezi daca merge

In c#, java, c, c++ index ul incepe de la 0


(Tudor) #10

N-a mers.

Însă a funcționat ideea lui @mrapi cu creatul câmpului în baza de date.

Mersi tuturor de ajutor!

Însă încă ceva. Ce funcție este apelată atunci când apăs pe butonul Adaugă? Și cum pot lua valoarea unei anumite coloane pe un anumit rând. Spre exemplu cum aflu care este prețul produsului cu id 5?


(Adrian Stanculescu) #11

Faci linq pe dt:
Ceva de genul
var results = from myRow in dt.AsEnumerable()
where myRow.Field(“id”) == 5
select myRow;


(Tudor) #12

Și ce funcție e apelată când apăs butonul Adauga?


(Ionescu Mihai) #13

Pe grid ai un event CellClick, iar acolo faci un if daca coloana e cea cu butonul si atunci apelezi functia de “Adauga”.


(Tudor) #14
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            var senderGrid = (DataGridView)sender;

            if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
                MessageBox.Show("M-ai apasat!", " ", MessageBoxButtons.OK);
        }

Am încercat asta și nu merge.


(mrapi) #15

Campul nu trebuie neaparat in baza de date,poti sa-l pui in interogarea SQL
SELECT ID,... 1 AS CANTITATE,....FROM...

fara LINQ poti gasi un articol

dt.DefalutView="ID"
var idx = dt.DefalutView.Find(5);
 if (idx ==1){
   //negasit
}else{
 //   dt.DefalutView[idx]["PRET"]
}

(Tudor) #16

ok ok am inteles, dar poti sa-mi spui te rog de ce nu merge butonul Adauga? Ti-am dat si codul cu ce se intampla cand il apelez (uita-te mai sus putin)


(Tudor) #17

Am rezolvat. Trebuia si butonul sa aiba o coloana in db.


(Tudor) #18

Inca ceva. Cand eu incarc datele din tabela, cum le pot filtra. Gen, vreau sa extrag doar randurile ce au la campul id_client, valoarea 6?


(cosmos) #19

daca vrei cu sql
select * from tabel t where t.id_client = 6


Ti-as sugera sa citesti un tutorial de sql si sa folosesti debugger-ul din Visual Studio


(Tudor) #20

stiu sa scriu query-ul, dar unde il scriu?