Frage

Ich versuche, getrennte ComboBox Zellen in einem Datagridview zu einer benutzerdefinierten Klasse zu binden, und halte einen Fehler immer

  

DataGridViewComboBoxCell Wert nicht gültig ist

ich zur Zeit der Zuordnung der Datenquelle für die Zelle zu einem IList<ICustomInterface> aus einem Wörterbuch ich habe. Bei der Einstellung jedoch die Datenquelle, der Index für die ComboBoxCell nicht gesetzt ist, so dass er einen ungültigen Wert ausgewählt hat.

Ich versuche, herauszufinden, wie, um es einen realen Wert zu wählen, beispielsweise die 0-te Element in der Liste, um es einen anderen Weg gegeben, um diese Fehler zu beseitigen oder finden, um das Problem zu lösen ist. Jemand irgendwelche Vorschläge?

War es hilfreich?

Lösung

ich es geschafft, die Lösung nicht lange zu finden, nachdem die Frage der Veröffentlichung. Für alle anderen:

Das Problem war, dass ich versuche, das DataGridViewComboBoxCell.Value zu einem Objekt zugewiesen werden, erwarten, dass, weil die Zelle an eine Datenquelle gebunden wurde, dass es automatisch das Objekt in der Quelle und Aktualisierung finden würde.

Das war nicht wirklich der Fall ist, müssen Sie den Wert tatsächlich gleich die die ValueMember Eigenschaft setzen, damit er korrekt den Wert zu aktualisieren und zu binden. Ich glaube, ich war sowohl ValueMember und DisplayMember eine Eigenschaft ‚Name‘ für die Verwendung von (Kontrollen, wie das in der Zelle macht), so man den Wert auf interface.ToString() (anstelle der Schnittstelleninstanz) arbeitet für die Mehrzahl der Fälle. Dann habe ich alle Ausnahmen abfangen und Dataerror ignorieren, die auftreten, während ich die Quelle bin Wechsel um.

Andere Tipps

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

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

Sie tun können, dass nur nach "InitializeComponent ();"

After Stunden Studien, finde 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.

Ich hatte das gleiche Problem.

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

Im Page_Load Ereignisse:

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

Ich habe das gleiche Problem. Nach dem Bestücken meine ComboBox Spalte in der (unbouod) DataGrid-, löste ich mein Problem durch die Valuemember-Eigenschaft des DataGridViewComboBoxColumn Einstellung Offenbar auf dem ToString() Eigentum der Objekte in der ComboBox nur unter Berufung ist nicht genug.

Die tatsächliche 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     

verwenden 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 ... !!

Stellen Sie einen Nullwert für die Zelle:

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

Im Interesse der Menschen nicht so viel kämpfen, wie ich.

Wenn die Bindung des Combo Sie eine Display setzen (was der Benutzer sehen) und Valuemember (was Ihre Anwendung erhalten).

Nach dem Einrichten diese müssen Sie den Wert einzurichten und das ist, wo sie versagt. Grundsätzlich ist der Typ des Werts muss die gleiche Art wie die Valuemember sein.

Also, wenn Ihr Wert Element eine ID offensichtlich seine vom Typ INT und Sie müssen Ihren Wert setzen zum Beispiel auf int Cell.Value = 1;.

Ich habe das gleiche Problem. Die Botschaft war auf 100% vor Ort. Die Werte für die Combobox waren wie: Exakt, ... Starts und ich habe versucht, den Wert zu setzen Exacta (nicht exakt). Dies geschieht automatisch als ich die Datentabelle für die Datagridview aus einer XML-Datei mit DataTable.ReadXml (...) zu lesen. Die Werte in der XML-Datei waren aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top