3

我有两个在运行时添加的 DataGridViewComboBoxColumn 我需要第一个 DataGridViewComboBoxColumn 的项目在 gridview 的所有行中保持相同,但我希望第二个 DataGridViewComboBoxColumn 的项目根据所选的行与另一个不同第一个 DataGridViewComboBoxColumn 的项

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

4

3 回答 3

3

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

假设网格被命名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;
        }
    }
}

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

于 2009-11-20T15:15:10.793 回答
2

看看这个,我认为它概述了你需要什么:

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

于 2009-11-11T15:46:32.583 回答
1

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

这里有一个例子。

于 2009-01-25T10:34:38.447 回答