我忙于一个简单的应用程序。它读取xml并将信息放在树视图中。
我这样做是通过创建TreeNodes并嵌套它们,最后返回根treenode。因为我想在选择treenode时显示一些额外的信息,所以我将信息放在TreeNode的tag属性中。通过这种方式,我应该能够在选择节点时检索信息。
但是当我尝试检索Tag属性中的信息时,它会显示value = null。
以下是填写标记的代码。这是一个递归用于读取XML dom的函数。 treeNode是赋予此函数的参数。
if (treeNode.Tag == null)
{
treeNode.Tag = new List<AttributePair>();
}
(treeNode.Tag as List<AttributePair>).Add(new AttributePair(currentNode.Name, currentNode.Value));
这是选择了treenode的事件
private void tvXML_AfterSelect(object sender, TreeViewEventArgs e)
{
if (tvXML.SelectedNode.Tag != null)
{
}
if (e.Node.Tag != null)
{
}
}
两个值都计算为null。我该如何解决这个问题?
答案 0 :(得分:8)
您发布的代码应该按原样运行。您的代码中的其他内容,您未在此处发布的代码,会导致此问题中断。它可能是清除标签,它可能是标签上的数据绑定集等。
如果没有看到您的所有代码,我能做的最好的就是猜测并帮助您找出问题。
这就是我要做的事:setup Visual Studio to allow stepping into the .NET framework source code with the debugger。然后,在TreeNode.Tag属性的setter上设置断点。将代码中的标记设置为AttributePair列表后,请查看何时再次设置该标记。断点将命中,您将查看堆栈跟踪并查看清除Tag属性的确切内容。
答案 1 :(得分:3)
如果原则上不使用Tag属性,我建议继承TreeItem:
public class MyTreeNode : TreeNode
{
public List<AttributePair> list;
public MyTreeNode (string text,List<AttributePair> list) : base(text)
{
this.list = list;
}
//or
public MyTreeNode (string text) : base(text)
{
this.list = new List<AttributePair>();
}
}
并使用它:
private void tvXML_AfterSelect(object sender, TreeViewEventArgs e)
{
if (tvXML.SelectedNode is MyTreeNode)
{
MyTreeNode selectedNode = tvXML.SelectedNode as MyTreeNode;
selectedNode.list.Add(.., ..);
}
if (e.Node is MyTreeNode)
{
MyTreeNode node = e.Node as MyTreeNode;
node.list.Add(.., ..);
}
}
答案 2 :(得分:0)
也许您在Select事件后分配值。否则,您可以将TreeNode和标记值的字典维护为变通方法。
答案 3 :(得分:0)
尝试在上面某处(在您所在的内部作用域之外)声明/初始化List对象,并在分配给.tag属性时 - 不要创建新列表,而是分配以前创建的List对象。
答案 4 :(得分:0)
如果没有看到其余的代码,我们必须做出有根据的猜测。鉴于你在对你的问题的评论中所说的话
介于两者之间,我不再触摸标签属性了。是的,我使用了调试器。在第一种方法中,我看到标签获取它的值,在第二种方法中,我看到值为空。
我想说生成事件的控件(通过参数发送者收到的控件)不是tvXML。
此表单上是否有其他TreeView? 您是否偶然将事件绑定到错误的TreeView实例?
检查这一点的简单方法是将发件人与tvXML进行比较。
private void tvXML_AfterSelect(object sender, TreeViewEventArgs e) {
// FOR DEBUG: Check it is the right instance
if (sender != tvXML) {
throw new InvalidOperationException();
}
if (tvXML.SelectedNode.Tag != null) {
}
if (e.Node.Tag != null) {
}
}
答案 5 :(得分:0)
private TreeViewItem _subsender;
private object _senderTag;
public TreeViewItem _sender
{
get {
return _subsender;
}
set
{
_senderTag = value.Tag;
_subsender = value;
}
}
我发现的解决方案也遇到了同样的问题
不要使用.tag但是_senderTag
(由于某种原因,不要更改套装中的线条:D)
(你不能重置标签(可能是新的TreeViewItem))