DataGridView.IsCurrentRowDirty
仍为true
。我想将其设置为false
,以便在失去焦点时不会触发RowValidating
。
我有DataGridView
绑定到BindingList<T>
。我处理CellEndEdit
事件并保存对数据库的更改。保存这些更改后,我希望将DataGridView.IsCurrentRowDirty
设置为true
,因为该行中的所有单元格都是最新的;但是,它设置为false
。
这会给我带来麻烦,因为当行失去焦点时会触发RowValidating
,我会处理并验证所有三个单元格。所以即使所有单元格都有效且没有一个是脏的,它仍然会验证商场。那是浪费。
以下是我所拥有的一个例子:
void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
// Ignore cell if it's not dirty
if (dataGridView.isCurrentCellDirty)
return;
// Validate current cell.
}
void dataGridView_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
// Ignore Row if it's not dirty
if (!dataGridView.IsCurrentRowDirty)
return;
// Validate all cells in the current row.
}
void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// Validate all cells in the current row and return if any are invalid.
// If they are valid, save changes to the database
// This is when I would expect dataGridView.IsCurrentRowDirty to be false.
// When this row loses focus it will trigger RowValidating and validate all
// cells in this row, which we already did above.
}
我看过帖子说我可以调用表单的Validate()
方法,但这会导致RowValidating
触发,这就是我要避免的。
知道如何将DataGridView.IsCurrentRowDirty
设置为true
吗?或者可能是一种阻止RowValidating
不必要地验证所有单元格的方法?
答案 0 :(得分:3)
您是否在将数据保存到数据库后尝试调用DataGridView1.EndEdit()。
答案 1 :(得分:0)
Validating
两次射击我遇到了同样的问题。在编辑之前(正如预期的那样)进行编辑,然后再根据我认为的DataGridView
焦点发生变化。
没有时间调查。快速修复是this.ActiveControl = null;
我不确定这是否有任何意外后果,但它通过以编程方式取消控制来修复验证问题。
private void cntrl_MethodParameters_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
//Init
var dgv = (DataGridView)sender;
int row = e.RowIndex;
int col = e.ColumnIndex;
//Validate Edit
if ((row >= 0) && (col == cntrl_MethodParameters.Columns.IndexOf(cntrl_MethodParameters.Columns[MethodBuilderView.m_paramValueCol])))
{
string xPropertyName = (string)cntrl_MethodParameters[MethodBuilderView.m_paramNameCol, row].EditedFormattedValue;
string xPropertyValue = (string)cntrl_MethodParameters[MethodBuilderView.m_paramValueCol, row].EditedFormattedValue;
bool Validated = FactoryProperties.Items[xPropertyName].SetState(xPropertyValue);
//Cancel Invalid Input
if (!Validated)
{
dgv.CancelEdit();
}
}
this.ActiveControl = null;
}