自动完成文本框集合
问题描述:
在Windows窗体中,可以通过为文本框提供一个简单的字符串列表或通过为其提供一个自定义源文件,该文本框只能是一个 AutoCompleteCollection,它是一个强类型的字符串列表。 我希望能够为每个字符串添加一个键..因此,只要有任何建议被选中,我可以抓住该键。自动完成文本框集合
我可能只是画空白..但没有人有建议吗? 在此先感谢
答
AutoCompleteStringCollection类不是密封的,所以您肯定可以从中派生出来并创建一个Add的重载,它带有两个参数:一个键和一个值。
然后你可以在字典中跟踪。你必须存储字符串两次(基类的集合在你的字典各一次),但是你可以添加一个查找方法,像这样:
class KeyedAutoCompleteStringCollection : AutoCompleteStringCollection {
private readonly Dictionary<string,string> keyedValues =
new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase);
public void Add(string value, string key) {
base.Add(value);
keyedValues.Add(value, key); // intentionally backwards
}
public string Lookup(string value) {
string key;
if (keyedValues.TryGetValue(value, out key)) {
return key;
}
else {
return null;
}
}
}
答
如果我理解正确的话,你想要的值在文本框中(可以自动建议)具有关联的值。您可以通过创建一个Dictionary<string, string>
并将TextBox
文本作为关键字以及您将“关键字”称为值来实现。无论何时您想要查找某个特定TextBox
值的“密钥”,都可以查看该字典。
当然,如果必须有密钥,TextBox
可能不是表示数据的最佳方式。如果必须有密钥,则ComboBox
(其中DropDownStyle
设置为ComboBoxStyle.DropDownList
)可能是更好的选择。
我以为我可以从AutoCompleteCollection继承并重新实现add和get,但是我只能覆盖toString,getHashCode和Equals .... – irco 2010-02-15 23:57:17
如果您对Josh的回答作出回应,您应该将其发布在他的回答中。至于你的评论,你可以实现另一个名字相同但参数不同的方法来重载它。您只能覆盖虚拟成员,但始终可以重载。 – 2010-02-16 00:03:02
你不需要“重写”(覆盖)。相反,你会增加一个过载。此方法不会替换接受一个参数的现有Add方法,而是添加一个额外的Add方法,该方法需要2个参数。在我的答案中看到我的例子。 – Josh 2010-02-16 00:03:07