我正在苦苦挣扎DataGridViewComboBoxCell
。在某些情况下(比方说,事件)我必须ComboBox
在我的表单中预先选择一个值DataGridView
。当用户更改一个框时,我可以像这样以编程方式更改另一个框:
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));
}
获取列表项方法:
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
或类似的东西。ItemCode
和ItemName
列项通过 . 正确填充和返回GetListItem()
。我不明白为什么它可以正常工作,但是在表单加载时它不起作用(显示它也不起作用)。
编辑:对不起,忘记添加。
我的 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";