在列表视图中查找不区分大小写的键?在listview中禁用空列?

时间:2012-01-05 08:48:33

标签: c# .net visual-studio list listview

我有一个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];

但这似乎是一个更简洁的形式。

2 个答案:

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