2009-03-17 6 views
23

Я пытаюсь связать отдельные ComboBox клетки в DataGridView в пользовательском классе, и продолжают получать сообщение об ошибкеDataGridViewComboBoxCell Binding - «Недопустимое значение»

значение DataGridViewComboBoxCell не является действительным

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

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

+1

Можете ли вы разместить код? – JaredPar

ответ

26

Мне удалось найти решение вскоре после размещения вопроса. Для кого-либо еще:

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

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

+3

Для кого-либо, кто сталкивается с этим, вы имеете в виду, что свойство ValueMember должно равняться значению ячейки. DisplayMember - соответствующее поле, которое вы хотите видеть. – Chris

3

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

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

Это все.

+1

@NaSo помните! вам нужно вылечить проблему, а не игнорировать ее. кстати, вы связали 'cellCombo.DataSource', что совершенно неправильно. на самом деле 'DataGridViewComboBoxCell.DataSource' будет связан автоматически, когда вы установите' DataGridViewComboBoxColumn.DataSource' – Rzassar

2

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

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

В Page_Load Событие:

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

У меня та же проблема. После заполнения моего столбца ComboBox в (Data Unix) 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

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

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

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

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

вы можете сделать это только после того, как " InitializeComponent();»

+0

Работает очень хорошо в моем случае, спасибо! – peterkodermac

+0

Что должно быть значением 'MyEnum'? –

+0

перечисление, которое вы хотите в своем поле со списком, которое соответствует вашим данным. – Sauleil

0

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

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

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

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

1

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

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

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

0

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

Смежные вопросы