【问题标题】:Search and notify for duplicates in a groupbox containing multiple textboxes在包含多个文本框的组框中搜索并通知重复项
【发布时间】:2026-02-10 05:00:01
【问题描述】:

我有一个包含 5 个文本框的组框控件。

作为验证过程的一部分,每次用户在文本框中输入内容时,我都必须检查重复条目。

我已将这些文本框引用存储在通用列表中,即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 控件引发错误。

虽然,上述方法工作得还不错,但不知何故,我不太相信它的实现。你们中的任何人都可以提出更好的方法来解决这个问题。

提前致谢 增值税

【问题讨论】:

    标签: c# linq validation


    【解决方案1】:

    其实你的方法很不错!

    我个人会将所有文本框放在一个容器中,然后只遍历文本框类型的子面板,而不是初始化它们的列表。

    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
    }
    

    【讨论】:

    • 谢谢。但是你会做些什么来验证重复的文本条目。 ?
    • 刚刚在我的答案中添加了一个编辑,其中包含使用不同 LINQ 扩展方法的示例。检查一下,虽然我认为你的方法更好。
    最近更新 更多