我在处理 DataGridViewComboBoxCell
时遇到了困难。在某些情况下(比如事件),我必须预先选择一个值作为我的表单中 DataGridView
中的 ComboBox
的选项。当用户更改其中一个框时,我可以通过以下方式编程更改另一个框:
var item = ItemName.Items.GetListItem(name);
if (item != null)
{
_loading = true; // that's needed to come around another CellValueChanged events
itemView.Rows[e.RowIndex].Cells["ItemName"].Value = item;
_loading = false;
}
我正在以下方式填充ItemName.Items
:
foreach (var item in _model.DefaultData.ItemList)
{
if (item.Value.Code.HasValue()) ItemCode.Items.Add(new ListItem(item.Key, item.Value.Code));
ItemName.Items.Add(new ListItem(item.Key, item.Value.Name));
}
GetListItem方法:
public static ListItem GetListItem(this DataGridViewComboBoxCell.ObjectCollection col, string name)
{
ListItem retItem = null;
foreach (ListItem item in col)
{
if (item.Name == name) { retItem = item; break; }
}
return retItem;
}
这个方法很好,但是...
现在我想在窗体加载时像这样向DataGridView
添加行:
foreach (var item in _model.SelectedItems)
{
var row = new DataGridViewRow();
row.Cells.Add(new DataGridViewTextBoxCell { Value = item.Id });
row.Cells.Add(new DataGridViewComboBoxCell { Value = ItemCode.Items.GetListItem(item.Code) });
row.Cells.Add(new DataGridViewComboBoxCell { Value = ItemName.Items.GetListItem(item.Name) });
row.Cells.Add(new DataGridViewTextBoxCell { Value = item.Units });
...
itemView.Rows.Add(row);
}
这会抛出一个深受喜爱的DataGridViewComboBox value is not valid
异常。请帮忙,我已经没有想法了。我不想使用DataSource
或类似的东西。通过GetListItem()
,ItemCode
和ItemName
列项被填充并正确返回。我不明白为什么它平常工作,但在窗体加载时却不起作用(在显示时也不起作用)。
编辑:对不起,忘了添加。
我的ListItem类:
public class ListItem
{
public int Id { get; set; }
public string Name { get; set; }
public ListItem(int sid, string sname)
{
Id = sid;
Name = sname;
}
public override string ToString()
{
return Name;
}
}
我已经在窗体加载时也添加了:
ItemName.ValueMember = "Id";
ItemName.DisplayMember = "Name";
ItemCode.ValueMember = "Id";
ItemCode.DisplayMember = "Name";
ItemName.Items.Add(...)
向ComboBox
添加项目,其中ItemName
是ComboBox
。正如我所说的,在网格单元格更改时更改值时它能够正常工作,但在程序加载时动态添加行时则无法工作。 - YOhan