在包含多个文本框的组合框中搜索并通知重复项

时间:2015-04-06 11:09:15

标签: c# linq validation

我有一个包含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

1 个答案:

答案 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
}