我有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一样。
答案 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!";
}
}
}