1

像这样的东西:

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

异常还是空?

4

3 回答 3

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则会抛出 a。TryGetValue您可以使用or来检查字典是否包含给定的键ContainsKey

if(dict.ContainsKey(key))
{
    var value = dict[key];
}
else
{
}

TryGetValue 在一次调用中进行查找并将给定变量设置为值(它存在),因此通常是首选。

string value;
if(dict.TryGetValue(key, out value))
{
    //use value
}
else { ... }
于 2012-08-02T20:10:43.323 回答
1

异常还是空?

好吧,您可以自己尝试一下或阅读文档(它会引发异常)。

此外,您的代码不会像发布的那样编译。 Tag是一种将任意数据与对象相关联的方法。因此,它的类型是object,因此您需要在使用它之前对其进行转换。

如果您的代码由于过度使用该属性而变得笨拙,Tag我建议创建您自己的节点类型,该节点类型继承自默认值TreeNode(或任何它),并使用该类型的对象填充您的树视图。

于 2012-08-02T20:09:48.160 回答
0

处理节点标签属性的最严格方法是:

((TagType)node_identity.Tag).TagProperty = value;

因此,父节点的标签属性可以这样处理:

((TagType)node_identity.Parent.Tag).TagProperty = value;

节点的标签属性可以这样处理:

((TagType)node_identity.Nodes[index_of_child].Tag).TagProperty = value;

并且随着每个Nodes[index_identifier]解析为一个节点,更多远程子节点的标签属性可以这样处理:

((TagType)node_identity.Nodes[index_of_child].Nodes[index_of_further_child].Tag).TagProperty = value;

等等。

就标记您的字典的假定对象而言......假设您的目的需要在任何地方都使用相同的整数字符串关联,我会简单地将整数键值存储到您的 Tag 字段,并从可能的全局中提取关联的字符串List<string> DictionaryStrings 对象。然后你可以只将整数索引值存储到你的标签中;并且只有您的 List<string> 的字符串值。

然后,您将按如下方式读取您的标签值:

((int)node_identity.Tag)

鉴于这些假设,您将改为填充您的基础架构,以便:

List<string> DictionaryStrings = new List<string>;
DictionaryStrings.Add("Canada"); // etc.

然后,您将读取标签以从存储到标签的索引值中提取 DictionaryString,如下所示:

string DictionaryString = DictionaryStrings[((int)node_identity.Tag)];

您的错误消息是寻址您尚未添加(在该执行点)到您的字典的字典的潜在成员的结果。首先完全填充列表或字典;然后只处理属于列表/字典的有效索引。

于 2021-09-03T17:16:01.540 回答