Привязка DataGridViewComboBoxCell - " значение недопустимо"



Я пытаюсь привязать отдельные ячейки ComboBox в DataGridView к пользовательскому классу и продолжаю получать ошибку




Значение DataGridViewComboBoxCell недопустимо




В настоящее время я назначаю источник данных для ячейки IList<ICustomInterface> из словаря, который у меня есть. Однако при установке источника данных индекс для ComboBoxCell Не задан, поэтому выбрано недопустимое значение.



Я пытаюсь понять, как заставить его выбрать реальное значение, например, 0-й элемент в списке было дано, чтобы устранить эту ошибку, или найти другой способ решить проблему. У кого-нибудь есть предложения?

1147   9  

9 ответов:

Мне удалось найти решение вскоре после публикации вопроса. Для всех остальных:

Проблема заключалась в том, что я пытался назначить DataGridViewComboBoxCell.Value объекту, ожидая, что поскольку ячейка была привязана к источнику данных, она автоматически найдет объект в источнике и обновит его.

На самом деле это не так, вам нужно установить значение, равное значению свойства ValueMember, чтобы оно правильно обновило значение и привязку. Я думаю, что я использовал свойство 'Name' как для ValueMember, так и для DisplayMember (управляет отображением в ячейке), поэтому установка значения interface.ToString() (а не экземпляра интерфейса) работает в большинстве случаев. Затем я ловлю и игнорирую любые исключения DataError, которые происходят во время изменения источника.

Вот мое простое решение при использовании перечислений

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

Это можно сделать сразу после "InitializeComponent ();"

После нескольких часов испытаний я, наконец, нашел решение, которое работает.

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

Вот и все.

У меня была такая же проблема.

В моем случае решением было заполнить адаптер данных таблицы внешнего ключа. Это не было заполнено автоматически, и это было причиной проблемы.

В событии Page_Load:

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

У меня та же проблема. После заполнения моего столбца ComboBox в (unbouod) DataGrid я решил свою проблему, установив свойство ValueMember DataGridViewComboBoxColumn По-видимому, просто полагаться на свойство ToString() объектов в ComboBox недостаточно.

Фактический код:

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

Использовать обработчик событий DataError,

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

И ваш тип данных DisplayMember и ValueMember должны быть одинаковыми, в моем случае у меня есть CountryName для обоих. У меня все отлично получается...!!

Задайте нулевое значение для ячейки:

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

Ради того, чтобы люди не боролись так сильно, как я.

При привязке комбо вы устанавливаете DisplayMember (то, что увидит пользователь) и ValueMember (что получит ваше приложение).

После их настройки вам нужно настроить значение, и это то, где он терпит неудачу. В основном тип значения должен быть таким же, как и ValueMember.

Таким образом, если ваш элемент value является идентификатором, очевидно, что он имеет тип INT, и вам нужно установить значение int, например Клетка.Значение = 1;.

У меня была та же проблема. Сообщение было на 100% точным. Значения для combobox были такими: точный, StartsWith... и я пытался установить значение Exactă (не точное). Это происходило автоматически, когда я читал DataTable для DataGridView из an .xml-файл с DataTable.Метод readxml(...). Значения в системе .xml-файл был выключен.

Comments

    Ничего не найдено.