Привязка DataGridViewComboBoxCell - “значение недопустимо”
-
19-08-2019 - |
Вопрос
Я пытаюсь привязать отдельные ячейки ComboBox в DataGridView к пользовательскому классу и продолжаю получать ошибку
Значение DataGridViewComboBoxCell недопустимо
В настоящее время я назначаю источник данных для ячейки IList<ICustomInterface>
из Словаря, который у меня есть.Однако после настройки источника данных индекс для ComboBoxCell
не задан, поэтому для него выбрано недопустимое значение.
Я пытаюсь выяснить, как заставить его выбрать реальное значение, например0-й элемент в списке, который был предоставлен для устранения этой ошибки или поиска другого способа решения проблемы.У кого-нибудь есть какие-нибудь предложения?
Решение
Мне удалось найти решение вскоре после публикации вопроса.Для кого - нибудь еще:
Проблема заключалась в том, что я пытался назначить 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()
свойств объектов в выпадающем списке недостаточно.
Фактический код:
/// <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, например Cell.Value = 1;.
У меня была та же проблема.Сообщение было на 100% точным.Значения для выпадающего списка были следующими:Точно, начинается с...и я пытался установить значение Exactă (не точное).Это происходило автоматически, когда я считывал DataTable для DataGridView из xml - файла с DataTable.ReadXml(...).Значения в XML-файле были отключены.