Laden...

Wie BackColor von Cells anhand der Selektion setzen?

Letzter Beitrag vor 2 Monaten 2 Posts 273 Views
Wie BackColor von Cells anhand der Selektion setzen?

Ich habe eine Form mit einer DataGridView. Dort werden Zeilen farbig markiert (wie im folgenden Code beschrieben). Ich verstehe eines nicht. Wenn ich die erste Zeile klicke, werden alle Zeilen farbig (grün, siehe Anhang) markiert. Ich verstehe nicht, woran das liegen könnte. Hat eventuell hier im forum jemand einen Tipp für mich?

        //Ich habe hier eine Form, welche ein Datum, d. h. einen Termin, darstellt.

        private void CreateDataGridViewContacts()
        {
            if (dataGridViewC != null) {

                Controls.Remove(dataGridViewC);
            }

            

            dataGridViewC = new DataGridView();


            dataGridViewC.Location = new System.Drawing.Point(380, 70);

            //usw.

            //Es gibt dort eine DataGridView, die DataGridView hat drei Spalten, id, name und xColumn, id ist nicht sichtbar.
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "id";
            column.Name = "id";
            dataGridViewC.Columns.Add(column);

            dataGridViewC.Columns["id"].Visible = false;

            column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "name";
            column.Name = "name";
            dataGridViewC.Columns.Add(column);

            
            column = new DataGridViewTextBoxColumn();
            column.Name = "xColumn";
            column.HeaderText = "";
            dataGridViewC.Columns.Add(column);

            dataGridViewC.CellClick += DataGridViewC_CellClick;
            dataGridViewC.RowsAdded += new DataGridViewRowsAddedEventHandler(DataGridViewC_RowsAdded);

            LoadDataIntoDataGridView();

            Controls.Add(dataGridViewC);
        }

         


        private void LoadDataIntoDataGridView()
        {
            ContactDao contactDao = new ContactDao();

            DataSet contactsDataSet = contactDao.GetContacts();
            if (contactsDataSet.Tables.Count > 0)
            {
                dataGridViewC.DataSource = contactsDataSet.Tables[0];
            }
        }


        
        private void DataGridViewC_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            ContactDao contactDao = new ContactDao();
            

            //Wenn die xColumns angeklickt wird, soll folgendes passieren...
            if (e.ColumnIndex == dataGridViewC.Columns["xColumn"].Index)
            {


                var cellValue = dataGridViewC.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                if (cellValue != null && cellValue.ToString() == "+")
                {
                    var idValue = dataGridViewC.Rows[e.RowIndex].Cells["id"].Value;
                    if (idValue != null)
                    {
                        // this.id.ToString() ist die ID des Datums (Termins), für das Objekt mit der id idValue.ToString() 
                        contactDao.ToggleCouple(this.id.ToString(), idValue.ToString());
                        //entscheidet diese Methode, ob das Objekt mit dem Datum verknüpft ist oder nicht.
                    }

              
                    CreateDataGridViewContacts();

                
                }
            }
        }


        private void DataGridViewC_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            ContactDao contactDao = new ContactDao();

            for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
            {


                dataGridViewC.Rows[i].Cells["xColumn"].Value = "+";

                string cellValue = dataGridViewC.Rows[i].Cells["id"].Value.ToString();

                bool isLink = contactDao.GetLinkedContact(this.id.ToString(), cellValue);

                if (dataGridViewC.Rows[i].Cells["id"].Value != null && isLink)
                {
                    //Wenn das Objekt mit dem Termin verknüpft ist, soll dessen Zeile in der DataGridView grün werden.
                    //Das funktioniert auch, es gibt aber ein Problem: Wenn ich die erste Zeile klicke, ist ALLES grün.
                    //An dem Eintrag in der DB scheint es nicht zu liegen! Was kann dieses Verhalten für Ursachen haben?
                    dataGridViewC.Rows[i].DefaultCellStyle.BackColor = Color.Green;

                }
            }

        }

Mit welchen Werten von e.RowIndex und e.RowCount wird denn die RowsAdded-Eventmethode aufgerufen?


Dein Code ist aber noch verbesserungsfähig:

  • Warum erstellst du bei jedem CellClick auf +ein neues DataGridView-Objekt (CreateDataGridViewContacts())?
  • Warum erstellst du in jeder Methode ein neues ContactDao-Objekt?
  • Beim mehrfachen Zugriff auf z.B. dataGridViewC.Rows[i]solltest du eine lokale Variable (Referenz) dafür erstellen.

PS: Was macht contactDao.ToggleCouple(...), da du weder den Rückgabewert auswertest noch anderweitig danach Code diesbzgl. ausführst?

Und mir ist noch aufgefallen, daß du in der RowsAdded-Eventmethode zuerst auf Cells["id"].Value.ToString()zugreifst bevor auf nullgetestet wird...