如何避免向列表视图控件添加重复的行
本文关键字:添加 控件 何避免 列表 视图 | 更新日期: 2023-09-27 18:34:39
我有一个要向其添加帐户的列表视图控件。列表视图的第一列用于帐户的用户名,第二列用于帐户的密码。
我想避免添加重复的登录凭据行。我的意思是,我不在乎用户名是否多次出现在列表视图控件中。只要用户名的每个实例都有不同的密码。相同的规则适用于密码。我不在乎多个帐户是否具有相同的密码。
我只是想避免重复的行。
以下代码是我尝试过但没有成功的东西:
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!)
*/
我想避免完全重复:
/*
# PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
# NicholasPowell ---- 4ZN5TKfM
# PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
*/
如果帐户的密码发生更改,则我希望能够使用新密码将该帐户再次添加到我的列表视图控件中。我还想将旧帐户信息保留在我的列表视图控件中。这就是为什么我想在我的列表视图控件中允许重复的用户名。
您正在创建一个新的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
。
代码中需要更改的内容很少。您不必为此使用 2 个列表。一个清单就足够了。可以使用 C# 中的可用功能更有效地执行此类操作。
所以作为第一步;创建一个类并从IEqualityComparer
继承它。我们必须覆盖Equals
和GetHashCode
方法,以便在 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
}