1

我正在尝试通过以下方式检索 DataGridViewComboBoxCell 的值

向 ComboBox 添加项目时:

    public void LoadLayouts()
    {
        ImmutableSet<string> layoutNames = _store.Current.Keys;
        var dgvComboBox = (DataGridViewComboBoxColumn)this.schedulesDataGrid.Columns[1];

        foreach (string name in layoutNames)
        {
            dgvComboBox.Items.Add(name);
        }
    }

尝试读回该值时:

var combo = (DataGridViewComboBoxCell) this.schedulesDataGrid[args.ColumnIndex, args.RowIndex];
string LayoutChosen = (string)combo.Value;

但是,即使我可以看到在 ComboBox 中选择了一个值,该值返回为 null,FormattedValue返回为“”。

我尝试将名称数组设置为我的数据源,但是考虑到我只有一个值(布局的名称),我不确定为我的显示和值成员设置什么

想法?

4

1 回答 1

0

在您尝试读取单元格的值时,该行尚未提交更改。如果您有可见的行标题,您将在尚未提交的行上看到铅笔图标。这通常发生在细胞失去焦点之后。您可以通过挂钩到就地编辑控件组合框并使其在更改值时发布 EndEdit 来强制解决此问题:

void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    var comboBox = e.Control as ComboBox;
    if (comboBox != null)
    {
        // remove any handler we may have added previously
        comboBox.SelectionChangeCommitted -= new EventHandler(comboBox_SelectionChangeCommitted);
        // add handler
        comboBox.SelectionChangeCommitted += new EventHandler(comboBox_SelectionChangeCommitted);
    }
}

void comboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
    // Allow current dispatch to complete (combo-box submitting its value)
    //  then EndEdit to commit the change to the row
    dgv.BeginInvoke(new Action(() => dgv.EndEdit()));
}
于 2012-09-14T22:00:23.637 回答