2011-01-13 2 views
0

Ich habe eine DataGridView mit einer Binding-Source an eine Datentabelle gebunden, die von einer Oracle-Datenbank geladen wurde. (btw. Ich glaube nicht, dass die Datenbank-Verbindung dies verursachen könnte)datatable.GetChanges() zeigt immer die erste Zeile von DataGridView

Ich habe auch eine DataGridViewComboBoxColumn an ​​eine Klasse von Personen gebunden (nur "hat" ID und Name), damit ich es anzeigen/bearbeiten lassen kann der Name anstelle der ID Mein Problem ist nun, dass C# nach dem Abschluss der Datenbindung automatisch die erste Zelle des DGV "auswählt" - siehe angehängtes Bild.

alt text

Ich habe auch dieses kleine Stück Code verwenden, um die Datenintegrität sicherzustellen:

private void _table_ColumnChanging(object sender, DataColumnChangeEventArgs e) 
    { 
     if (e.Column == _table.Columns["NEEDED_ID"]) 
     { 
      if (e.ProposedValue == null) 
      { 
       e.ProposedValue = System.DBNull.Value; 
      } 
     } 
    } 

nun unter Verwendung dieser _table.GetChanges() liefert immer die erste Zeile des DGV als „modifizierte "Aber der Wert wird nicht wirklich geändert - es ist nur DBNull statt null. Kann ich irgendwie die automatische Auswahl der ersten Zelle vermeiden oder wie kann ich dieses Verhalten vermeiden?

EDIT: Inzwischen habe ich festgestellt, dass das Ändern der ersten Spalte zu etwas nicht editierbar dieses Problem behebt. Aber das ist nichts anderes als ein Workaround. Ich würde es sehr schätzen, eine funktionierende Lösung dafür zu bekommen.

EDIT 2: Ich habe auch ein leeres Objekt 'auf' der ComboBox-Datasource

DtoPerson blankPerson = new DtoPerson(); 
    blankPerson.Name = String.Empty; 
    blankPerson.PersonRollenId = -1; 
    personList.Add(blankPerson); 
+0

in Bezug auf EDIT 2: Das ist nicht gerade ein leeres Objekt, Sie sollten den Primärschlüssel Ihres blankPersons auf DBNull.Value setzen. Obwohl IMO der einfachste Weg ist, Ihr Problem zu lösen, ohne etwas am Front-End zu berühren, ist, UNION SELECT NULL, NULL für Ihre Abfrage zu verwenden. ADO.NET konvertiert diese NULL-Werte automatisch in den entsprechenden .NET-Typ (d. H. DBNull.Value); Ich habe die gleiche Technik benutzt, es funktioniert. Aber zuerst, machen Sie Ihren DtoPerson Primärschlüssel einen Objekttyp, so dass Ihr ORM/DAL DBNull ihm zuweisen kann –

Antwort

0

Versuchen Sie, eine Null in Ihrem DataGridViewComboBoxColumn Datasource zu setzen. Beispiel:

SELECT id, description 
FROM yourTable 
UNION 
SELECT NULL, NULL 
+0

Ich habe ein leeres Objekt in der Datenquelle (siehe meine Bearbeitung) – basti

+1

versuchen, Ihre primäre DtoPerson machen Geben Sie einen ** object ** -Typ ein, damit Sie DBNull.Value an die Combobox übergeben können.Wenn Sie die DataSource der DataGridView von DataTable aus festlegen, hat der Nullwert DBNull.Value –

0
GridViewName.ClearSelection(); 
+0

Funktioniert hier nicht :( – basti