我有一个包含5个文本框的groupbox控件。
作为验证过程的一部分,每次用户在文本框中输入内容时,我都必须检查重复的条目。
我已将这些文本框引用存储在通用列表中,即List<TextBox>
例如:我将列表命名为 uniqueIdList 。
为了检查重复条目,我依赖TextBox控件提供的Validated事件。
即。每当用户输入文本并移动到另一个控件时,控件就会调用OnValidated事件。我处理此事件以检查重复项。
即。
private void txtID1_Validated(object sender, EventArgs e)
{
if (txtID1.Text != string.Empty)
{
ValidateDuplicateId(sender);
}
}
ValidateDuplicateId ()方法
private void ValidateDuplicateId(object sender)
{
errProviderDuplicateID.Clear();
TextBox input = (TextBox)sender;
if(uniqueIdList.GroupBy(tb => tb.Text)
.Where(gp => gp.Skip(1).Any()).Count() > 1)
{
errProviderDuplicateID.SetError((TextBox)sender,"Duplicate ID");
errProviderDuplicateID.BlinkStyle = ErrorBlinkStyle.AlwaysBlink;
}
}
因此,只要用户在字段中输入文本,文本框控件就会触发经过验证的事件。我通过传递文本框的引用在每个事件处理程序中调用ValidateDuplicateId()。
ValidateDuplicateId方法,基本上检查重复项(如果同一文本出现多于1次),并使用errorprovider控件引发错误。
尽管如此,上述方法确实很好,不知何故,我对实施并不十分相信。你们中的任何人都可以建议一个更好的方法来解决这个问题。
提前致谢 VATSAG
答案 0 :(得分:0)
实际上,你的方法非常好!
我个人认为,将所有文本框放在一个容器中,只需查看文本框类型的面板,而不是初始化它们的列表。
IEnumerable<TextBox> allTextBoxes = myContainer.Children.OfType<TextBox>();
但那不是必须,这只是我的偏好。
修改强>
您可以使用 Distinct LINQ扩展名检查重复项。
IEnumerable<TextBox> containerTextboxes = myContainer.Children.OfType<TextBox>();
int initialCounter = containerTextboxes.Count();
int distinctCounter = containerTextboxes.Select(tb => tb.Text).Distinct();
if (initialCounter == distinctCounter)
{
// No duplicates
}
else
{
// There are duplicates
}