排序时DataGridView验证错误丢失。根本没有对数据源更新进行验证

时间:2014-01-02 10:59:26

标签: c# .net winforms datagridview

我有DataGridView我通过DataTable绑定到BindingSource。简单的示例代码。

DataTable records;
BindingSource bindRecords;

private void InitGrid() {
    records = new DataTable();
    records.Columns.Add(new DataColumn("text", typeof(string)));

    bindRecords = new BindingSource();
    bindRecords.DataSource = records;

    dgvRecords.DataSource = bindRecords;
}

然后我使用像这样的CellValidating事件:

private void dgvRecords_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
    if(e.ColumnIndex == dgvRecords.Columns["text"].Index) {
        if(e.FormattedValue.ToString() == "error") {
            dgvRecords[e.ColumnIndex, e.RowIndex].ErrorText = "Oops!";
        }
    }
}

现在,当用户输入文字“文字”错误时,单元格中会显示错误图标。到目前为止一切都很好。

但如果我对列进行排序,则验证将丢失。据我所知,为了激活单元格验证事件,必须输入单元格然后离开。

在以类似方式编程插入数据时,我也遇到同样的问题:

private void btnAddRecord_Click(object sender, EventArgs e) {
    records.Rows.Add(new object[] { "error" });
}

我如何强制进行验证?我不希望黑客像遍历网格和设置CurrentCell一样。

1 个答案:

答案 0 :(得分:1)

您的问题是,当您退出单元格(即完成编辑)时,似乎只会发生CellValidating事件。因此,我测试并发现将您指定的代码放入排序后触发的另一个事件(如CellPainting),可以实现您的目标。例如:

    private void dgvRecords_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex == dgvRecords.Columns["text"].Index)
        {
            if (e.FormattedValue.ToString() == "error")
            {
                dgvRecords[e.ColumnIndex, e.RowIndex].ErrorText = "Oops!";
            }
        }
    }