如何避免向列表视图控件添加重复行?

时间:2016-02-14 01:29:33

标签: c# winforms listview

我有一个列表视图控件,我想添加帐户。列表视图的第一列用于帐户的用户名,第二列用于帐户的密码。

我希望避免添加重复的登录凭据。我的意思是我不关心用户名是否多次出现在列表视图控件中。只要用户名的每个实例都有不同的密码。相同的规则适用于密码。我不在乎多个帐户是否有相同的密码。

我只想避免重复 ROWS

以下代码是我尝试过但没有成功的代码:

private void AddAccounts()
{
    List<string> usernames = new List<string>();
    usernames.Add("Margaret Parker");
    usernames.Add("Steven Stewart");
    usernames.Add("Heather Powell");
    usernames.Add("Denise Simmons");
    usernames.Add("Ronald Moore");

    List<string> passwords = new List<string>();
    passwords.Add("mExEvHb3");
    passwords.Add("muFLdtHu");
    passwords.Add("GrcSNCyY");
    passwords.Add("S8qenUZY");
    passwords.Add("PVAzFYyu");

    // usernames.Count will always be the same as passwords.Count
    // so it doesn't matter which property I use.
    for (int i = 0; i < usernames.Count; i++)
    {
        ListViewItem lvi = new ListViewItem(usernames[i]);
        lvi.SubItems.Add(passwords[i]);

        if (!accountsListView.Items.Contains(lvi))
        {
            // It is unsafe to call a control from a thread other
            // than the one that created the control without using
            // the Invoke method.
            Invoke((MethodInvoker)delegate { accountsListView.Items.Add(lvi); });
        }
    }
}

当调用 AddAccounts()时,它会将以下项目添加到 accountsListView

    /*
    #   Margaret Parker       mExEvHb3
    #   Steven Stewart        muFLdtHu
    #   Heather Powell        GrcSNCyY
    #   Denise Simmons        S8qenUZY
    #   Ronald Moore          PVAzFYyu
    */

如果帐户已添加到列表视图控件中,则会考虑。这就是为什么我来找你们帮忙的人。

如何避免将重复行添加到列表视图控件?

感谢您抽出宝贵时间阅读我的问题。

我想允许使用相同用户名或密码的多个实例:

    /*
    #   JamesEdwards ---- LZsDVQ7A ---- different password (GOOD!)
    #   GeraldLopez  ---- LZsDVQ7A    
    #   JamesEdwards ---- 7cbrPRzt ---- different password (GOOD!)
    */

我想避免使用EXACT副本:

    /*
    #   PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
    #   NicholasPowell  ---- 4ZN5TKfM    
    #   PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
    */

如果帐户的密码有所变更,那么我希望能够使用新密码将该帐户再次添加到我的列表视图控件中。我想在列表视图控件中保留旧帐户信息。这就是为什么我想在列表视图控件中允许重复的用户名。

2 个答案:

答案 0 :(得分:1)

您正在创建ListViewItem的新实例并验证集合中是否存在,该集合执行引用检查并始终返回false

而不是accountsListView.Items.Contains(lvi)

这样做

ListViewItem item = accountsListView.FindItemWithText(userNames[i]);

if (item == null)
{
    // logic goes here.
}

bool found = false;
foreach(ListViewItem lv in accountsListView.Items)
{
    if(lv.Text ==userNames[i]) 
    {
        found = true; 
        break;
    }
}

if(!found)
{
     // logic goes here.   
} 

记下ListView还提供FindItemWithText来验证项目是否存在。

答案 1 :(得分:0)

您需要在代码中更改一些内容。您不必为此目的使用2个列表。一个清单应该足够了。您可以使用C#中的可用功能来更有效地执行此类操作。

所以作为第一步;创建一个类并从IEqualityComparer继承它。我们必须覆盖EqualsGetHashCode方法才能在Linq等中使用。

    public class UserAccount : IEqualityComparer<UserAccount>
    {
        public string UserName { get; set; }
        public string Password { get; set; }

        public bool Equals(UserAccount x, UserAccount y)
        {
            return (x.UserName == y.UserName && x.Password == y.Password);
        }

        public int GetHashCode(UserAccount obj)
        {
            return obj.UserName.GetHashCode() + obj.Password.GetHashCode();
        }
    }

然后使用上面创建的类创建List个用户帐户。

       var userAccounts = new List<UserAccount>
       {
           new UserAccount() {UserName = "PhillipAnderson", Password = "4ZN5TKfM"},
           new UserAccount() {UserName = "NicholasPowell", Password = "4ZN5TKfM"},
           new UserAccount() {UserName = "PhillipAnderson", Password = "4ZN5TKfM"}
       };

现在,您可以使用Distinct方法过滤掉重复的用户帐户。在应用uniqueUserAccounts后,您会注意到Distinct只有2个用户帐户。

        var uniqueUserAccounts = userAccounts.Distinct(new UserAccount()).ToList();

        foreach (var uniqueUserAccount in uniqueUserAccounts)
        {
            //your code to add user accounts to the list view
        }