从--- DataGridViewComboBoxColumn中检索项目

时间:2009-06-07 19:05:09

标签: c# .net datagridview

假设我设计了一个DataGridView,其comboBoxColumn名为'dataGridViewComboBocColumn'。

我可以使用以下代码填充comboBox:

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";
    }

但是如何检索选定的项目对象。这样我就可以将该项目转换并转换为Book - object。

2 个答案:

答案 0 :(得分:0)

你不能:(

这是DataGridViewComboBoxColumn的限制。

我通过创建一个TypeDescriptor来解决这个问题,该{{1}}添加了一个名为'this'的额外项,它返回实例。

答案 1 :(得分:0)

好的,这是你可以做的一点点黑客攻击。首先,挂钩到DataGridView的EditingControlShowing事件,并在事件处理程序中,EventArgs有一个属性e.Control,可以强制转换为标准的ComboBox。因此,保留一个由int作为rowindex键入的字典。然后,在事件处理程序中,将组合框添加到字典中:

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

然后,当你需要获得组合框的 out 时,只需遍历你的字典,然后获得正确的组合框,然后获取SelectedItem / SelectedValue。