Pergunta

Estou tentando ligar células ComboBox separadas dentro de um DataGridView para uma classe personalizada, e continuo recebendo um erro

valor DataGridViewComboBoxCell não é válido

Atualmente estou atribuindo a fonte de dados para a célula a um IList<ICustomInterface> de um dicionário que eu tenho. Após a definição da fonte de dados no entanto, o índice para a ComboBoxCell não está definido, por isso tem um valor inválido selecionado.

Eu estou tentando descobrir como obtê-lo para selecionar um valor real, por exemplo, o item 0 dentro da lista que tenha sido dada para remover esse erro, ou encontrar outra maneira de resolver o problema. Alguém tem alguma sugestão?

Foi útil?

Solução

Eu consegui encontrar a solução não muito tempo depois de postar a pergunta. Para qualquer outra pessoa:

O problema era que eu estava tentando atribuir o DataGridViewComboBoxCell.Value a um objeto, esperando que, porque o celular foi ligado a uma fonte de dados que iria encontrar automaticamente o objeto na fonte e atualização.

Este não era realmente o caso, você realmente precisa para definir o valor igual ao da propriedade ValueMember para ele para atualizar corretamente o valor e vinculativa. Eu acredito que eu estava usando uma propriedade 'Nome' para ambos ValueMember e DisplayMember (controla como a presta na célula) para a definição do valor para interface.ToString() (em vez da instância interface) funciona para a maioria dos casos. Então eu pegar e ignorar quaisquer excepções DataError que ocorrem enquanto eu estou mudando a fonte ao redor.

Outras dicas

Aqui está a minha solução simples ao usar enums

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

Você pode fazer isso apenas depois de "InitializeComponent ();"

Afters horas de ensaios, eu finalmente encontrei uma solução que funciona.

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

Isso é tudo.

Eu tive o mesmo problema.

No meu caso a solução era encher o adaptador de dados da tabela de chave externa. Isso não estava sendo preenchido automaticamente e esta foi a causa do problema.

No evento Page_Load:

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

Estou tendo o mesmo problema. Depois de preencher a minha coluna ComboBox no (unbouod) DataGrid, eu resolvi o meu problema, definindo a propriedade ValueMember do DataGridViewComboBoxColumn Aparentemente, apenas contando com a propriedade ToString() dos objetos na caixa de combinação não é suficiente.

código real:

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

uso manipulador DataError Evento,

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

e seu tipo de dados DisplayMember e ValueMember deve ser o mesmo, no meu caso eu tenho CountryName para ambos. Tudo funciona bem para mim ... !!

Definir um valor nulo para a célula:

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

Por uma questão das pessoas não se esforçando tanto quanto eu fiz.

Quando se liga o combo você está definindo uma DisplayMember (o que o usuário vai ver) e ValueMember (o que sua aplicação terá).

Depois de configurar estes você precisa configurar o valor e é aí que ele falhar. Basicamente o tipo de necessidades de valor a ser o mesmo tipo que o ValueMember.

Portanto, se seu membro valor é um ID, obviamente, a sua do tipo INT e você precisa definir o seu valor para int por exemplo Cell.Value = 1;.

Eu estava tendo o mesmo problema. A mensagem foi 100% local. Os valores para a caixa de combinação eram como: Exacta, StartsWith ... e eu estava tentando definir o valor Exacta (não Exact). Isso estava acontecendo automaticamente como eu estava lendo o DataTable para o DataGridView de um arquivo .xml com DataTable.ReadXml (...). Os valores no arquivo .xml estavam fora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top