【问题标题】:Value of tag property disappears标签属性的值消失
【发布时间】:2018-11-13 10:48:22
【问题描述】:

我正忙于一个简单的应用程序。它读取 xml 并将信息放在树视图中。

我通过创建 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));

这是一个树节点被选中的事件

private void tvXML_AfterSelect(object sender, TreeViewEventArgs e)
{
    if (tvXML.SelectedNode.Tag != null)
    {
    }
    if (e.Node.Tag != null)
    {
    }
}

这两个值都为 null。我该如何解决这个问题?

【问题讨论】:

  • 这对我有用 - 可能听起来很愚蠢,但你确定你没有更改某个地方的节点以将标签设置为 null 吗?
  • 您必须使用调试器并单步执行代码才能查看实际发生的情况
  • 在这两者之间,我不再碰标签属性了。是的,我使用了调试器。在第一种方法中,我看到标签获取它的值,而在第二种方法中,我看到该值是空的。
  • 您是否偶然在表单上设置了 Localizable 属性?
  • 由于时间不够,未能提供更多细节。对不起。

标签: c# winforms


【解决方案1】:

您发布的代码应该按原样工作。您的代码中的其他内容,即您未在此处发布的代码,正在导致此错误。可能是清除标签,也可能是标签上设置的数据绑定等。

没有看到你所有的代码,我能做的最好的就是猜测并帮助你隔离问题。

我会这样做:setup Visual Studio to allow stepping into the .NET framework source code with the debugger。然后,在 TreeNode.Tag 属性的设置器上设置断点。将代码中的标记设置为 AttributePair 列表后,查看它何时再次设置。断点将命中,您将查看堆栈跟踪并查看究竟是什么清除了您的 Tag 属性。

【讨论】:

    【解决方案2】:

    如果原则上不使用 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(.., ..);
        }
    }
    

    【讨论】:

      【解决方案3】:

      也许您是在 Select 事件之后分配值。否则,您可以维护一个 TreeNode 字典和标记值作为解决方法。

      【讨论】:

      • 分配值的类,构建树节点,所以不可能在选择事件之后分配它。我也想过这个解决方法,但我想避免它
      【解决方案4】:

      尝试在上面的某个位置(在您所在的内部范围之外)声明/初始化您的 List 对象,当您分配给 .tag 属性时 - 不要创建新列表,而是分配以前创建的 List 对象。

      【讨论】:

        【解决方案5】:
            private TreeViewItem _subsender;
            private object _senderTag;
            public TreeViewItem _sender
            {
                get {
                    return _subsender;
                }
                set
                {
                    _senderTag = value.Tag;
                    _subsender = value;
                }
            }
        

        在我找到的解决方案中遇到了同样的问题

        不要使用 .tag 而是使用 _senderTag

        (出于某种原因,请勿更改集合中的行:D)

        (你不能只重置标签(也许是新的 TreeViewItem ))

        【讨论】:

          猜你喜欢
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          相关资源
          最近更新 更多