3

在我的 C# WPF 应用程序(.NET 4.0)中,我有一个从包含 DataGridComboBoxColumn 的代码动态填充的 DataGrid:

public static DataGridComboBoxColumn getCboCol(string colName, Binding textBinding)
{
    List<string> statusItemsList = new StatusList();

    DataGridComboBoxColumn cboColumn = new DataGridComboBoxColumn();
    cboColumn.Header = colName;
    cboColumn.SelectedItemBinding = textBinding;
    cboColumn.ItemsSource = statusItemsList;

    return cboColumn;
}

使用BeginningEdit 事件执行不同的检查。

如果检查返回正常,我想直接展开组合框,否则取消编辑模式:

void dataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    ...
    if(notOK)
        e.Cancel;
    else {
        DataGridComboBoxColumn dgCboCol = (DataGridComboBoxColumn)e.Column;
        // expand dgCboCol
    }
    ...
}

问题:如何以编程方式扩展组合框?开始编辑事件是正确的地方吗?


回答:

void dataGrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
    if (e.EditingElement.GetType().Equals(typeof(ComboBox)))
    {
        ComboBox box = (ComboBox)e.EditingElement;
        box.IsDropDownOpen = true;
    }
}
4

2 回答 2

2

看看这个

尝试将网格上的编辑模式设置为单击,然后使用 CellClick 事件获取组合框并展开它。

dataGrid.BeginEdit(true); 
ComboBox comboBox = (ComboBox)dataGrid.EditingControl; 
comboBox.IsDropDownOpen = true;
于 2013-08-15T12:17:12.880 回答
1

DataGridBeginningEditEventArgs,您可以像这样访问要编辑的单元格的生成元素:

var contentComboBox = e.Column.GetCellContent(e.Row) as ComboBox;

但是,我不确定这是否会获得您需要的实际 ComboBox。DataGrids 可以为每个单元格生成两个不同的元素,具体取决于它们是否处于编辑模式(只读和读写元素)。由于BeginningEdit发生在进入编辑模式之前,这将获得只读元素。

处理此问题的更好事件可能是PreparingCellForEdit,它将BeginEdit在数据项上实际调用后触发(换句话说,如果BeginningEdit未取消)。在这种情况下,您可以通过EditingElement属性直接访问该元素。

于 2013-08-15T13:12:12.770 回答