Привязка DataGridViewComboBoxCell - " значение недопустимо"
Я пытаюсь привязать отдельные ячейки ComboBox в DataGridView к пользовательскому классу и продолжаю получать ошибку
Значение DataGridViewComboBoxCell недопустимо
В настоящее время я назначаю источник данных для ячейки IList<ICustomInterface> из словаря, который у меня есть. Однако при установке источника данных индекс для ComboBoxCell Не задан, поэтому выбрано недопустимое значение.
Я пытаюсь понять, как заставить его выбрать реальное значение, например, 0-й элемент в списке было дано, чтобы устранить эту ошибку, или найти другой способ решить проблему. У кого-нибудь есть предложения?
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 для обоих. У меня все отлично получается...!!
Ради того, чтобы люди не боролись так сильно, как я.
При привязке комбо вы устанавливаете DisplayMember (то, что увидит пользователь) и ValueMember (что получит ваше приложение).
После их настройки вам нужно настроить значение, и это то, где он терпит неудачу. В основном тип значения должен быть таким же, как и ValueMember.
Таким образом, если ваш элемент value является идентификатором, очевидно, что он имеет тип INT, и вам нужно установить значение int, например Клетка.Значение = 1;.
У меня была та же проблема. Сообщение было на 100% точным. Значения для combobox были такими: точный, StartsWith... и я пытался установить значение Exactă (не точное). Это происходило автоматически, когда я читал DataTable для DataGridView из an .xml-файл с DataTable.Метод readxml(...). Значения в системе .xml-файл был выключен.
Comments