在DataGridView中自动验证

本文关键字:验证 DataGridView | 更新日期: 2023-09-27 18:03:30

我对WinForms并不陌生,但当涉及到验证时,我总是"自己动手"-我认为是时候利用内置的东西了。我在谷歌上搜索了一些基本信息,但我没有找到我需要的……

我有一个DataGridView。我有一个(自定义)对象,它有四个String属性。我从XML文件中得到一个列表<>。

所以当我这样做的时候:

dgv.DataSource = genericListOfStationObjects;

正确显示在DataGridView。因此,数据绑定工作得很好——至少在"传入"方向上是这样。

很好。
但是我需要做的是:

  1. 跟踪每一行的IsDirty(不手动添加标志?)
  2. 直观地指示(在DataGridView中)如果DataGridView的单元格中的任何值无效。(我的自定义对象(List<>就是由它组成的)上有验证方法。)我无法让那些"错误符号"显示出来。我已经尝试了我能找到的所有SO帖子…

非常感谢,
Eliezer

在DataGridView中自动验证

要回答你的第一个问题,你需要使用两个本地属性:

  1. IsCurrentCellDirty
  2. IsCurrentRowDirty

这些仅适用于当前选定的单元格/行。因此,如果您需要跟踪每一行的"IsDirty",您可能不得不自己制作。但有一个事件,自带的脏设置,CurrentCellDirtyStateChanged,你可以利用来记录所有的变化。您还可以使用CellValueChanged记录您可能需要的任何更改。我个人使用表单级属性来跟踪我是否通过使用这些事件中的任何一个进行了任何数据编辑/更改,如果我这样做了,我会在关闭表单之前保存编辑。

数据验证在WinForms DataGridView上是相当直接的。要获得要显示的红色错误符号,只需设置单元格或行的ErrorText。我也利用了DataGridView的原生RowValidating事件。

void dg_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
    DataGridViewRow dgRow = dg.Rows[e.RowIndex];
    if ((dgRow.Cells["yourColumnName"].Value == null) ||
        (dgRow.Cells["yourColumnName"].Value.ToString().Length == 0))
    {
        // Set both the row and cell error text at the same time.
        dgRow.ErrorText = dgRow.Cells["dgTxtColTest List"].ErrorText =
            "You must enter a value in the " + yourColumnName + " column."
        e.Cancel = true;
    }
}

当行被验证时,您必须清除上面可能创建的任何错误消息:

void dg_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    // Clear errors from row header and cells in the row
    DataGridViewRow row = dg.Rows[e.RowIndex];
    row.ErrorText = ""; // Clear the row header error text
    // Clear all error texts from the row
    foreach (DataGridViewCell cell in row.Cells)
    {
        cell.ErrorText = ""; // Clear each cell in the row as now row is valid
    } 
}