【问题标题】:Forcing ErrorText to show in a DataGridView强制 ErrorText 在 DataGridView 中显示
【发布时间】:2026-01-05 06:35:01
【问题描述】:

我已经在 Google 上搜索过并为此搜索过...

当我的应用程序启动时,它会加载一个配置文件并在 DataGridView 中显示其内容 - 包括在配置文件中发现的错误。

所以当我的方法 Main() 退出时,这里有一些关键值:

  • dgv.Rows[0].Cells[3].ErrorText 包含 “只允许使用字母数字字符”
  • dgv.Visible 是假的
  • dgv.Rows[0].Cells[3].IsInEditMode 是假的

以下是相关代码:

    public Main()
    {
        InitializeComponent();
        dgvStationConfiguration.DataSource = FileReaderWriter.GetStationsFromConfigFile();
        StationConfigurationValidator.ValidateAllCellsAndSetAllErrorMessages(dgvStationConfiguration);
    }

    public static bool ValidateAllCellsAndSetAllErrorMessages(DataGridView dgv)
    {
        bool areAllCellsValid = true;

        foreach (DataGridViewRow row in dgv.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {
                bool isCellValid = ValidateCellAndSetErrorMessage(cell); // validate all cells in order to set their error text/glyphs; this flag is just to be able to return a summary

                if (isCellValid == false)
                {
                    areAllCellsValid = false;
                }
            }
        }

        return areAllCellsValid;
    }

    public static bool ValidateCellAndSetErrorMessage(DataGridViewCell cell)
    {
        string columnName = cell.OwningColumn.Name;
        string cellValue = cell.EditedFormattedValue.ToString();

        cell.ErrorText = StationConfigurationValidator.GetCellErrorMessage(columnName, cellValue);
        return cell.ErrorText == string.Empty;
    }

当方法完成并且向用户显示 DataGridView 时,没有可见的红色错误字形。如果我单击该单元格然后再单击该单元格(即 [0][3])- 字形出现。

我的印象是,主要问题是设置 ErrorText 时(在方法 Main 中) DataGridView 仍然不可见。

我变得如此绝望,以至于我正在考虑这个令人难以置信的黑客:让计时器在 10 毫秒内关闭(以允许 Main 方法退出)以设置 ErrorText -然后禁用(取消挂钩)计时器。这是一个我无法忍受的黑客...只是说明我的绝望... :-(

所以... 我需要做什么才能让那个字形显示???

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 您可能会在这个问题中找到解决方案:*.com/questions/291475/…
  • @kurubaran,我在问题中添加了代码。
  • @Saragis,在发布之前,我已经多次阅读该问题/答案。没有任何帮助,除了它在那里说的:“在设置 ErrorText 属性时 DataGridView 必须可见” 我认为这可能是问题(如上所述).. .但我只是不确定如何解决它......
  • 好吧,这可能确实是问题所在。那么你的网格什么时候变得可见?是否可以重构以便在将可见性设置为 true 后立即进行验证检查?或者您可以保持原样,但将错误和行/列值存储在集合中,并在使网格可见后应用。

标签: c# .net winforms data-binding datagridview


【解决方案1】:

将您的数据网格验证代码放在Load 事件中而不是在您的构造函数中,字形将立即显示,无需处理VisibleChanged 事件。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        List<KeyValuePair<int, string>> list1 = new List<KeyValuePair<int, string>>();
        list1.Add(new KeyValuePair<int, string>(1, "string 1"));
        list1.Add(new KeyValuePair<int, string>(2, "string 2"));
        list1.Add(new KeyValuePair<int, string>(3, "string 3 is too long."));
        list1.Add(new KeyValuePair<int, string>(4, "string 4"));
        list1.Add(new KeyValuePair<int, string>(5, "string 5"));

        dataGridView1.DataSource = list1;
        DgvValidator();
    }

    private void DgvValidator()
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (((string)row.Cells[1].Value).Length > 10)
                row.Cells[1].ErrorText = "ERROR!";
        }
    }
}

【讨论】: