Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在从--DataGridViewComboxColumn检索项_C#_.net_Datagridview - Fatal编程技术网

C# 正在从--DataGridViewComboxColumn检索项

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)

假设我设计了一个DataGridView,它有一个名为“dataGridViewComboBocColumn”的comboBoxColumn

我可以使用以下代码填充组合框:

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”检索该项呢?