我有一个listview作为用户设置表。每个键都是设置,键的每个子项都是值,一切都很好,花花公子。
我希望能够将此表格链接到一个复选框。如果设置为true,则选中复选框,如果设置为false,则不选中该复选框。我们将设置称为“settingChecked”。
listview看起来像:
| Setting | Value |
| settingChecked | true |
无论如何都有这样的行...当用户输入设置时,我会运行一个函数来检查它的值并相应地选中复选框。同样,当他们单击复选框时,我需要更改表中的设置值。问题是设置不区分大小写。所以,如果他们提出:
| Setting | Value |
| sEttIngChecked | true |
我无法使用ListView1.Items [“settingChecked”]找到该值。我编写它的方式(我是C#的新手,所以在这方面减少了一些松弛)是遍历listview的每个元素并检查它的小写文本和设置的小写文本。代码看起来很块且效率低,看起来不对。当然,我可以在添加设置时更正外壳,但我想让用户可以随意打字。
因此,这产生了两个问题。首先,系统如何通过其键找到列表成员?是否有每个列表的地址键的引用?其次,如何通过其键找到元素,与案例无关?
我能想到的最好的,在替换迭代时,是一个带有引用listview中项目的Dictionary的类。这似乎也会占用比计划更多的资源。
最后,我如何摆脱列表视图中额外列的恼人的第三轮? listview不打算用作表吗?有没有更好的工具可供使用?
编辑:我知道我可以做类似的事情:
listView1.Items.Cast<ListViewItem>().Where(x => x.Text.ToLower() == "settingchecked").ToArray()[0];
但这似乎是一个更简洁的形式。
答案 0 :(得分:0)
您应该在创建密钥之前使用String.ToLower()
(documentation)方法(您自己在代码中,并使用用户的密钥)。这样你就可以确保所有按键具有相同的外壳。
答案 1 :(得分:0)
我不确定是谁,但是不久前有人发布了一个答案,说明将密钥设置为小写,这让我意识到文本不必与密钥相同。虽然我不知道密钥是如何设置的,但我做了一些测试,发现它是listviewitem的名称。
无论如何,像:
void AddSetting(string settingName, string value, ListView table) {
ListViewItem setting = new ListViewItem(settingName, value);
setting.Name = settingName.ToLower();
table.Items.Add(setting);
}
string GetSettingValue(string settingName, ListView table) {
if (table.Items.ContainsKey(settingName.ToLower())) {
return table.Items[settingName.ToLower()].SubItems[1].Text;
}
return null;
}