如何使用不同的数据填充每个DataGridViewComboBoxCell?

时间:2009-01-15 12:47:47

标签: c# datagridview combobox

我有两个DataGridViewComboBoxColumn我在运行时添加我需要第一个DataGridViewComboBoxColumn的项目在gridview的所有行保持相同但我希望第二个DataGridViewComboBoxColumn的项目从行到另一个取决于在第一个DataGridViewComboBoxColumn

的选定项目上

如果我们说第一个DataGridViewComboBoxColumn表示位置,第二个DataGridViewComboBoxColumn表示子位置。所以我希望第二个DataGridViewComboBoxColumn项是第一个DataGridViewComboBoxColumn所选位置的子位置

3 个答案:

答案 0 :(得分:2)

一种选择是在细胞级别更改子位置的数据源。

假设网格名为grid,两个网格列分别命名为locationsColumn subLocationsColumn

private void Form1_Load(object sender, EventArgs e)
{
    locationsColumn.DataSource = new string[] { "Location A", "Location B" };
}

然后,在网格的CellEndEdit事件中:

private void grid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if(locationsColumn.Index == e.ColumnIndex)
    {
        DataGridViewComboBoxCell subLocationCell = 
            (DataGridViewComboBoxCell)(grid.Rows[e.RowIndex].Cells["subLocationsColumn"]);

        string location = grid[e.ColumnIndex, e.RowIndex].Value as String;

        switch (location)
        {
            case "Location A":
                subLocationCell.DataSource = new string[] {
                    "A sublocation 1",
                    "A sublocation 2",
                    "A sublocation 3" 
                };
                break;
            case "Location B":
                subLocationCell.DataSource = new string[] { 
                    "B sublocation 1",
                    "B sublocation 2",
                    "B sublocation 3" 
                };
                break;
            default:
                subLocationCell.DataSource = null;
                return;
        }
    }
}

当现有行的位置发生变化时,需要进行一些额外的处理,但这是基本的想法。

答案 1 :(得分:1)

一个想法是为“SubLocations”列使用辅助绑定源。可以通过“位置”列中选择的LocationId过滤此BindingSource。执行此操作的关键是使用网格的EditingControlShowing和CellValueChanged事件在所选位置更改时在SubLocations列上设置正确的过滤。

有一个例子here

答案 2 :(得分:1)

检查一下,我认为它概述了你的需求:

http://www.timvw.be/2007/01/17/exploring-datagridviewcomboboxcolumn-databinding/