2009-03-17 8 views
23

„Wert ist nicht gültig“ Ich versuche in einem Datagridview zu einer benutzerdefinierten Klasse getrennte ComboBox Zellen zu binden und halten einen FehlerDataGridViewComboBoxCell Bindung -

DataGridViewComboBoxCell Wert bekommen ist nicht gültig

Ich bin derzeit die Zuordnung der Datenquelle für die Zelle zu einem IList<ICustomInterface> von einem Wörterbuch, das ich habe. Nach dem Einstellen der Datenquelle ist der Index für ComboBoxCell jedoch nicht festgelegt, daher ist ein ungültiger Wert ausgewählt.

Ich versuche herauszufinden, wie Sie es erhalten, um einen echten Wert, z. das 0th-Item in der Liste, die es gegeben wurde, um diesen Fehler zu entfernen, oder einen anderen Weg finden, das Problem zu lösen. Hat jemand irgendwelche Vorschläge?

+1

Können Sie den Code veröffentlichen? – JaredPar

Antwort

26

Ich habe die Lösung nicht lange nach dem Stellen der Frage gefunden. Für alle anderen:

Das Problem war, dass ich versuchte, die DataGridViewComboBoxCell.Value einem Objekt zuzuweisen, in der Erwartung, dass, weil die Zelle an eine Datenquelle gebunden war, das Objekt in der Quelle automatisch finden und aktualisieren würde.

Das war eigentlich nicht der Fall, Sie müssen den Wert tatsächlich gleich dem Wert der ValueMember-Eigenschaft festlegen, damit der Wert und die Bindung korrekt aktualisiert werden. Ich glaube, ich verwendete eine Eigenschaft 'Name' für beide ValueMember und DisplayMember (steuert, wie die Rendern in der Zelle) so für die Mehrheit der Fälle den Wert auf interface.ToString() (anstatt der Schnittstelle Instanz) funktioniert. Dann fangen und ignorieren ich alle DataError-Ausnahmen, die auftreten, während ich die Quelle ändere.

+3

Für jeden anderen, der darüber stolpert, meinen Sie, dass die ValueMember-Eigenschaft dem Zellenwert entsprechen muss - DisplayMember ist das entsprechende Feld, das Sie sehen möchten. – Chris

3

Nach stundenlangen Versuchen fand ich endlich eine Lösung, die funktioniert.

// Create a DataGridView 
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView(); 

// Create a DataGridViewComboBoxColumn 
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn(); 

// Add the DataGridViewComboBoxColumn to the DataGridView 
dgvCombo.Columns.Add(colCombo); 

// Define a data source somewhere, for instance: 
public enum DataEnum 
{ 
    One, 
    Two, 
    Three 
} 

// Bind the DataGridViewComboBoxColumn to the data source, for instance: 
colCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Create a DataGridViewRow: 
DataGridViewRow row = new DataGridViewRow(); 

// Create a DataGridViewComboBoxCell: 
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell(); 

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn: 
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance: 
cellCombo.Value = "Two"; 
// (No need to set values for DisplayMember or ValueMember.) 

// Add the DataGridViewComboBoxCell to the DataGridViewRow: 
row.Cells.Add(cellCombo); 

// Add the DataGridViewRow to the DataGridView: 
dgvCombo.Rows.Add(row); 

// To avoid all the annoying error messages, handle the DataError event of the DataGridView: 
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError); 

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e) 
{ 
    // (No need to write anything in here) 
} 

Das ist alles.

+1

@NaSo erinnern! Sie müssen das Problem beheben, nicht ignorieren. Übrigens hast du eine 'cellCombo.DataSource' gebunden, das ist total falsch. in der Tat wird 'DataGridViewComboBoxCell.DataSource' automatisch gebunden, wenn Sie' DataGridViewComboBoxColumn.DataSource' einstellen. – Rzassar

2

Ich hatte das gleiche Problem.

In meinem Fall war die Lösung, den Datenadapter der Fremdschlüsseltabelle zu füllen. Dies wurde nicht automatisch gefüllt und dies war die Ursache des Problems.

Im Page_Load Veranstaltung:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes) 
1

ich das gleiche Problem habe. Nach dem Füllen meiner ComboBox-Spalte im (unbouod) DataGrid löste ich mein Problem, indem ich die ValueMember-Eigenschaft des DataGridViewComboBoxColumn Anscheinend, nur auf die ToString() Eigenschaft der Objekte in der ComboBox verlassen, ist nicht genug.

Actual Code:

/// <summary> 
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan. 
/// </summary> 
/// <param name="bonus"></param> 
private void PopulateDataGridSplitVolumes(Bonus_Group bonus) 
{ 
    try 
    { 
    List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString); 
    foreach (Qualification qual in qualifications) 
    { 
     DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0]; 
     col.Items.Add(qual);      
    } 
    SplitVolumeGrid_QualificationColumn.ValueMember = "Name"; 
    } 
    catch (Exception ex) 
    { 
#if DEBUG 
    System.Diagnostics.Debugger.Break(); 
#endif 
    throw ex; 
    } 
}//PopulateDataGridSplitVolumes  
0

einen Nullwert für die Zelle Set:

dataGridView.CurrentRow.Cells[NAME].Value = null; 
9

Hier ist meine einfache Lösung, wenn Aufzählungen

ColumnType.ValueType = typeof (MyEnum); 
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum)); 

mit Ihnen, dass kurz nach tun können " Initialisieren der Komponente();"

+0

Funktioniert wirklich gut in meinem Fall, danke! – peterkodermac

+0

was sollte der Wert von 'MyEnum' sein? –

+0

die gewünschte Enumeration in Ihrer Combobox, die Ihren Daten entspricht. – Sauleil

0

Aus Gründen der Menschen nicht so viel kämpfen, wie ich es tat.

Beim Binden der Combo setzen Sie ein DisplayMember (was der Benutzer sehen wird) und ValueMember (was Ihre Anwendung bekommen wird).

Nach der Einrichtung dieser müssen Sie den Wert einrichten und dies ist, wo es fehlschlägt. Grundsätzlich muss der TYPE des Werts dem TYPE des ValueMember entsprechen.

Also, wenn Ihr Wert Mitglied ist eine ID offensichtlich ist der Typ INT und Sie müssen Ihren Wert auf int zum Beispiel Cell.Value = 1 ;.

1

Verwendung Dataerror-Ereignis-Handler,

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) 
     { 
      //You don't have to write anything here ! 
     } 

und Ihre Display und Valuemember Datentyp gleich sein sollte, in meinem Fall habe ich Country für beide. Alles funktioniert gut für mich ... !!

0

Ich hatte das gleiche Problem. Die Nachricht war 100% genau richtig. Die Werte für die Combobox waren wie folgt: Exact, StartsWith ... und ich habe versucht, den Wert Exactă (nicht Exact) zu setzen. Dies geschah automatisch, als ich die DataTable für das DataGridView aus einer XML-Datei mit DataTable.ReadXml (...) gelesen habe. Die Werte in der XML-Datei waren deaktiviert.

Verwandte Themen