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;
}
}
不知道这是否是最佳实践(我很确定不是(,但我所做的是创建一个方法来验证我需要验证的内容,并将其放在几个事件上:UserAddedRow、Focus Leave和Focus RowLeave。现在,您可以调试它,看看这3个事件中哪一个首先启动,并且与您的情况最匹配,然后只保留一个(或者最多2个(。但就我而言,我不得不匆忙地做这件事,从此再也没有回来过:(。祝你好运,让我知道是谁耍的把戏;(
使用在DataGridViewCellValidatingEventArgs参数中传递给您的行和列索引,在您的位置获取DataGridViewCell,然后根据最适合您的方法,您可以访问该单元格的Value
属性,或者检查该单元格是否为复选框单元格,并执行一些特殊情况逻辑。