[C#] Problem mit DataGridView, Wert darf in der Spalte nur einmal vorkommen

lukasS

Erfahrenes Mitglied
Hallo,

ich möchte in meinem DGV eine Spalte mit einem eindeutigen Schlüssel haben. Die DGV besitzt keine DataSource, die Daten werden direkt in das DGV hineingeschrieben.

So bald der Benutzer nun einen Wert in dieser Schlüssel-Spalte ändert bzw. eine neue Zeile mit dem Eintrag in die Spalte erstellt, überprüfe ich beim CellValueChanged ob der Wert schon vorhanden ist und kann den dann abfangen.

Das Problem ist aber, wenn der Benutzer einen schon vorhandenen Eintrag gemacht hat und dann z. B. ENTER drückt, hüpft die Selektion in die nächste Zeile. Ich möchte aber, dass sich die Zelle weiter hin im Editiermodus befindet. Das CellValueChanged wird ja vor der neuen Selektion ausgeführt.

Jetzt weiß ich leider nicht, wie ich das Problem am besten lösen sollte. Hat vielleicht jemand eine Idee oder einen Tipp? Muss ich jetzt noch die Tasten abfangen? :(

Hier der Code-Schnipsel aus dem CellValueChanged-Ereignis.

Code:
         if (e.ColumnIndex == 0)//Schlüsselspalte
         {
            string sVal = (string)dataGridView1.Rows[e.RowIndex].Cells[0].Value;

            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
               if ((string)dataGridView1.Rows[i].Cells[0].Value == sVal)
               {
                  MessageBox.Show(@"Falscher Eintrag");
                  
                  //Die nächsten Zeilen sind hier nutzlos
                  dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
                  dataGridView1.Rows[e.RowIndex].Cells[0].Selected = true;
                  dataGridView1.BeginEdit(false);
                  break;
               }
            }
         }


Danke schon mal!


Gruß

Lukas
 
So,

nach mehreren Stunden habe ich die Lösung durch einen Tipp gefunden. Im Ereignis CellValidating das e.Cancel = true bringt mich weiter. Hier der code, falls es jemand interessiert:

Code:
      private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
      {
         if (e.ColumnIndex == 0)
         {
            if (dataGridView1.CurrentCell.IsInEditMode)
            {
               string sVal = (string)e.FormattedValue;

               for (int i = 0; i < dataGridView1.Rows.Count; i++)
               {
                  if ((string)dataGridView1.Rows[i].Cells[0].Value == sVal)
                  {
                     MessageBox.Show(@"Falscher Eintrag");
                     e.Cancel = true;
                     break;
                  }
               }
            }
         }

      }

Gruß

Lukas
 

Neue Beiträge

Zurück