C# 正在从--DataGridViewComboxColumn检索项
假设我设计了一个DataGridView,它有一个名为“dataGridViewComboBocColumn”的comboBoxColumn 我可以使用以下代码填充组合框:C# 正在从--DataGridViewComboxColumn检索项,c#,.net,datagridview,C#,.net,Datagridview,假设我设计了一个DataGridView,它有一个名为“dataGridViewComboBocColumn”的comboBoxColumn 我可以使用以下代码填充组合框: private void DataGridViewForm_Load(object sender, EventArgs e) { BookCollection books = Book.GetAllBooks(); foreach (Book b in books)
private void DataGridViewForm_Load(object sender, EventArgs e)
{
BookCollection books = Book.GetAllBooks();
foreach (Book b in books)
{
dataGridViewComboBocColumn.Items.Add(b);
}
dataGridViewComboBocColumn.DisplayMember = "BookName";
dataGridViewComboBocColumn.ValueMember = "BookISBN";
}
但是如何检索选定的项对象。这样我就可以将该项目转换为图书对象。你不能:(
这是DataGridViewComboBoxColumn
的一个限制
我通过创建一个
TypeDescriptor
来解决这个问题,它添加了一个名为“this”的额外项,用于返回实例。好的,这里有一个小技巧。首先,钩住DataGridView的EditingControlShowing事件,在事件处理程序中,EventArgs有一个属性e.Control,可以转换为标准组合框。因此,保留一个由作为行索引的int键控的字典。然后,在事件处理程序中,将组合框添加到字典中:
private Dictionary<int, ComboBox> comboBoxes;
public Form1()
{
InitializeComponent();
this.comboBoxes = new Dictionary<int, ComboBox>();
this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
var cb = e.Control as ComboBox;
if (!(this.comboBoxes.ContainsKey(this.dataGridView1.CurrentRow.Index)))
{
this.comboBoxes.Add(this.dataGridView1.CurrentRow.Index, cb);
}
}
专用字典组合框;
公共表格1()
{
初始化组件();
this.combobox=新字典();
this.dataGridView1.EditingControlShowing+=新的DataGridViewEditingControlShowingEventHandler(dataGridView1\U EditingControlShowing);
}
私有void dataGridView1_EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e)
{
var cb=e.控件作为组合框;
if(!(this.combobox.ContainsKey(this.dataGridView1.CurrentRow.Index)))
{
this.combobox.Add(this.dataGridView1.CurrentRow.Index,cb);
}
}
然后,当您需要将对象从组合框中取出时,只需迭代字典,获得正确的组合框,然后获得SelectedItem/SelectedValue。但是我如何使用“this”检索该项呢?