这样的事情:
Dictionary<int, string> myData = new Dictionary<int, string>();
myData.Add(1, "England");
myData.Add(2, "Canada");
myData.Add(3, "Australia");
myTreeView.Node[0].Tag = myData;
然后我想得到这个对象,我应该怎么做? 像:
string str = new string();
str = myTreeView.Node[0].Tag[2]; // "str" should be equal to "Canada"
myTreeView.Node[0].Tag[1] = "Spain";
str = myTreeView.Node[0].Tag[1]; // now "str" is equal to "Spain"
第二个问题 - 什么会返回这个表达式:
Dictionary<int, string> myData = new Dictionary<int, string>();
myData.Add(1, "England");
myData.Add(2, "Canada");
myData.Add(3, "Australia");
string str1 = new string();
str = myData[4]; // there isn't such a key as 4
异常还是空?
答案 0 :(得分:3)
Control.Tag
被输入为object
,因此您需要将其转换为Dictionary<int, string>
Dictionary<int, string> dict = (Dictionary<int, string>)myTreeView.Node[0].Tag;
string str = dict[2];
类似于设置值:
var dict = (Dictionary<int, string>)myTreeView.Node[0].Tag;
dict[1] = "Spain";
如果您尝试访问不存在的密钥,则会抛出KeyNotFoundException
。您可以使用TryGetValue
或ContainsKey
:
if(dict.ContainsKey(key))
{
var value = dict[key];
}
else
{
}
TryGetValue执行查找并将给定变量设置为单个调用中的值(它存在),因此通常是首选。
string value;
if(dict.TryGetValue(key, out value))
{
//use value
}
else { ... }
答案 1 :(得分:1)
异常还是空?
嗯,您可以自己尝试一下或read the documentation(它会抛出异常)。
此外,您的代码不会像发布的那样编译。 Tag
是一种将任意数据与对象相关联的方法。因此,它的类型为object
,因此您需要在使用之前将其强制转换。
如果您的代码由于过度使用Tag
属性而变得笨重,我建议您创建自己的节点类型,该类型继承自默认的TreeNode
(或其他任何属性)并填充树视图相反,那种类型的对象。