0

我有一个 DataGridView,我希望用户能够直接向其中添加记录。这是通过单击 DGV 下方的链接来完成的,此时以编程方式添加了一个新行,第一个可见单元格是 ComboBoxCell 类型。我如何做到这一点的代码摘录是:

// Add a new row to DGV
DataGridView dgv = this.dgvInformation;
DataGridViewRow newRow = new DataGridViewRow();
dgv.Rows.Add(newRow);

// Create cells and add to row
DataGridViewComboBoxCell cellInfoType = new DataGridViewComboBoxCell();
newRow.Cells["InfoType"] = cellInfoType;

// Create DataSource based off LINQ query here
List<ComboItemAccountInfoType> comboDataSource = new List<ComboItemAccountInfoType>();
// List is populated here

// Assign DataSource to combo cell
cellInfoType.DataSource = comboDataSource;
cellInfoType.ValueMember = "AccInfoTypeID";
cellInfoType.DisplayMember = "InfoType";

// Scroll new row into view and begin editing
dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1;
dgv.CurrentCell = dgv[1, dgv.Rows.Count - 1];
dgv.BeginEdit(true);

DataSource 包含一些 ID 为 -1 的值,这些值是用户不应选择的类别,所有其他值都有其有效的数据库 ID。这一切都很好,除了如果用户选择了 -1 行,我无法继续编辑组合单元格,因为它只是将值存储在单元格中,我无法再激活下拉菜单。我已将以下代码添加到 _CellValueChanged 事件中,但没有任何效果:

private void dgvInformation_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dgv = this.dgvInformation;
    DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];

    // If type of cell is ComboBox then 
    if (cell.GetType() == typeof(DataGridViewComboBoxCell))
    {
        DataGridViewComboBoxCell cellInfoType = (DataGridViewComboBoxCell)cell;

        if ((int)cellInfoType.Value == -1)
        {
            MessageBox.Show("Going back into edit mode...");
            dgv.CurrentCell = cell;
            dgv.BeginEdit(true);
        }
        else
        {
            MessageBox.Show(cellInfoType.Value.ToString());
        }
    }
}

移动到另一个单元格后,我确实在此处收到“正在返回编辑模式...”消息,但它并没有按照它所说的去做!任何人都可以解释为什么它不会回到编辑模式,或者有没有办法防止值在被选择后立即被锁定?

非常感谢!

4

1 回答 1

1

如果值为-1,则应该有一个“验证”事件供您拦截和取消。

于 2012-09-20T14:21:00.193 回答