Domanda

Sto cercando di associare celle ComboBox separate all'interno di un DataGridView a una classe personalizzata e continuo a ricevere un errore

  

Il valore DataGridViewComboBoxCell non è valido

Attualmente sto assegnando l'origine dati per la cella a un IList < ICustomInterface > da un dizionario che ho. Al momento dell'impostazione dell'origine dati, tuttavia, l'indice per ComboBoxCell non è impostato, quindi ha un valore non valido selezionato.

Sto cercando di capire come ottenerlo per selezionare un valore reale, ad es. l'elemento 0 all'interno dell'elenco è stato fornito per rimuovere questo errore o trovare un altro modo per risolvere il problema. Qualcuno ha qualche suggerimento?

È stato utile?

Soluzione

Sono riuscito a trovare la soluzione non molto tempo dopo aver pubblicato la domanda. Per chiunque altro:

Il problema era che stavo cercando di assegnare DataGridViewComboBoxCell.Value a un oggetto, aspettandomi che, poiché la cella era associata a un'origine dati, avrebbe trovato automaticamente l'oggetto nella fonte e si sarebbe aggiornato .

In realtà non è stato così, in realtà è necessario impostare un valore uguale a quello della proprietà ValueMember per aggiornare correttamente il valore e l'associazione. Credo che stavo usando una proprietà 'Nome' sia per ValueMember che per DisplayMember (controlla come i rendering nella cella) quindi impostando il valore su interface. ) (anziché l'istanza dell'interfaccia) funziona nella maggior parte dei casi. Quindi prendo e ignoro tutte le eccezioni DataError che si verificano mentre sto cambiando l'origine.

Altri suggerimenti

Ecco la mia semplice soluzione quando si usano enum

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

puoi farlo subito dopo " InitializeComponent (); "

Dopo ore di prove, ho finalmente trovato una soluzione che funziona.

// 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)
}

Questo è tutto.

Ho avuto lo stesso problema.

Nel mio caso, la soluzione era quella di riempire l'adattatore dati della tabella Chiave esterna. Questo non veniva riempito automaticamente e questa era la causa del problema.

Nell'evento Page_Load :

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

Sto riscontrando lo stesso problema. Dopo aver popolato la mia colonna ComboBox nel DataGrid (unbouod), ho risolto il mio problema impostando la proprietà ValueMember di DataGridViewComboBoxColumn Apparentemente, basarsi sulla proprietà ToString () degli oggetti in ComboBox non è sufficiente.

Codice attuale:

/// <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     

usa il gestore eventi DataError,

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

e il tipo di dati DisplayMember e ValueMember dovrebbero essere uguali, nel mio caso ho CountryName per entrambi. Tutto funziona bene per me ... !!

Imposta un valore null sulla cella:

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

Per il bene delle persone che non lottano tanto quanto me.

Quando si associa la combo, si imposta un DisplayMember (cosa vedrà l'utente) e ValueMember (cosa riceverà l'applicazione).

Dopo aver impostato questi è necessario impostare il valore ed è qui che fallisce. Fondamentalmente il TIPO del valore deve essere lo stesso TIPO del ValueMember.

Quindi, se il membro del valore è un ID ovviamente è di tipo INT e è necessario impostare il valore su int, ad esempio Cell.Value = 1 ;.

Stavo avendo lo stesso problema. Il messaggio è stato preciso al 100%. I valori per la casella combinata erano: Exact, StartsWith ... e stavo cercando di impostare il valore Exact & # 259; (non esatto). Questo stava accadendo automaticamente mentre stavo leggendo la DataTable per DataGridView da un file .xml con DataTable.ReadXml (...). I valori nel file .xml erano disattivati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top