Привязка DataGridViewComboBoxCell - «значение недействительно» - PullRequest
26 голосов
/ 17 марта 2009

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

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

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

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

Ответы [ 9 ]

31 голосов
/ 17 марта 2009

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

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

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

13 голосов
/ 22 января 2014

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

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

вы можете сделать это сразу после «InitializeComponent ();»

3 голосов
/ 18 августа 2009

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

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

Это все.

2 голосов
/ 24 октября 2010

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

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

В Page_Load Событии:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes)
1 голос
/ 20 декабря 2016

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

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

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

1 голос
/ 09 мая 2011

У меня такая же проблема. После заполнения столбца 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     
0 голосов
/ 24 февраля 2018

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

0 голосов
/ 11 декабря 2015

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

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

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

Таким образом, если ваш элемент значения - это идентификатор, очевидно, он имеет тип INT, и вам необходимо установить значение int, например Cell.Value = 1;.

0 голосов
/ 20 октября 2013

Установить пустое значение для ячейки:

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