如何使用TreeView.Tag = object?

时间:2012-08-02 20:06:54

标签: c# .net winforms treeview

这样的事情:

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

异常还是空?

2 个答案:

答案 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。您可以使用TryGetValueContainsKey

检查字典是否包含给定密钥
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(或其他任何属性)并填充树视图相反,那种类型的对象。