C#窗体数据网格视图单元格验证

本文关键字:视图 单元格 验证 网格 数据网 窗体 数据 | 更新日期: 2023-09-27 18:00:55

我有一个包含3列的数据网格视图:Guid(不可见(、复选框列和字符串列。

我需要验证用户在字符串列中输入的内容。可能的情况:

1( 不允许输入重复记录

2( 不允许输入空记录

需要记住:新行或编辑行。例如,如果新行为空字符串,而用户离开了它,那么我必须取消这一新行。

但问题出在复选框列上。当我选中复选框并将其保留(文本列为空(时,我无法验证这一点。所以这是我的代码的瓶颈

 private void dgvKeywords_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex != 2)
            return;
        string keyWord = e.FormattedValue == null ? string.Empty : e.FormattedValue.ToString();
        if (string.IsNullOrWhiteSpace(keyWord))
            if (!dgvKeywords.Rows[e.RowIndex].IsNewRow)
            {
                e.Cancel = true;
                MessageBox.Show("Keyword cannot be empty", "Keyword processing", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
        var list = bsCustomerLanguageKeywords.DataSource as List<CustomerLanguageKeyword>;
        if (list == null)
            throw new Exception("Unexpected type in the keywords grid");
        var separatedList = list.Where((t, i) => i != bsCustomerLanguageKeywords.Position).ToList();
        bool nonUnique = separatedList.Count(x => x.Word != null && x.Word.ToLower() == keyWord.ToLower()) > 0;
        if (nonUnique)
        {
            e.Cancel = true;
            MessageBox.Show("Keyword must be unique", "Keyword processing", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return;
        }
    }

C#窗体数据网格视图单元格验证

不知道这是否是最佳实践(我很确定不是(,但我所做的是创建一个方法来验证我需要验证的内容,并将其放在几个事件上:UserAddedRow、Focus Leave和Focus RowLeave。现在,您可以调试它,看看这3个事件中哪一个首先启动,并且与您的情况最匹配,然后只保留一个(或者最多2个(。但就我而言,我不得不匆忙地做这件事,从此再也没有回来过:(。祝你好运,让我知道是谁耍的把戏;(

使用在DataGridViewCellValidatingEventArgs参数中传递给您的行和列索引,在您的位置获取DataGridViewCell,然后根据最适合您的方法,您可以访问该单元格的Value属性,或者检查该单元格是否为复选框单元格,并执行一些特殊情况逻辑。