Winforms中的Tag属性有什么用途?

21

我注意到了标记属性与控件。使用它来引用我的自定义对象可以吗,或者应该避免使用它,因为这会涉及到装箱和拆箱,这被认为是不安全的并且不推荐使用。

TreeNode tn = new TreeNode();
CustClass o = new CustClass()
o.number = 123;
tn.Tag = o;

class CustClass
{
    public int number {get; set;}
}

2
一个好的起点:MSDN关于标签的参考资料 - NullUserException
4个回答

42
Tag 属性的目的是让您将其用于任何想要的目的。 您可以安全地在其中存储任何内容。
通常会声明一个专门用于存储在 Tag 属性中的类(就像您使用 CustClass 一样)。 但是,如果您只需要一个值,则直接将 int 存储在其中是没有问题的。
你从哪里读到装箱/拆箱是“不安全”的?这绝对不是真的。(有些人声称它是低效的,但甚至这也不是真的。)此外,您的代码中甚至没有装箱的示例。 CustClass 是引用类型。 只有当分配给 object 时才会装箱值类型。

6
当大量使用时,拆箱是低效的,但在控件中使用一个 int 变量时,这不太可能被注意到。 - Joel Coehoorn

5
我认为这不是一个装箱或拆箱的问题,你可以按照自己的需求使用。据我所知,Tag属性仅供程序员使用,因此您可以根据需要使用它。
请参见MSDN上的Control.Tag属性,以了解如何使用此属性。
例如,我曾经在Windows Forms应用程序中使用它来向用户输入指令。当控件触发GotFocus事件时,指令Label.Text属性被赋值为我的控件Tag属性中包含的指令字符串的值。

4

以下是其他人提到的链接:

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.tag.aspx中,可以看到:

任何从 Object 类派生的类型都可以分配给此属性。如果通过 Windows Forms 设计器设置 Tag 属性,则只能分配文本。

tag 属性的常见用法是存储与控件密切相关的数据。例如,如果您有一个显示有关客户信息的控件,则可以将包含客户订单历史记录的 DataSet 存储在该控件的 tag 属性中,以便可以快速访问数据。

而在https://msdn.microsoft.com/zh-cn/library/system.windows.forms.treenode.tag.aspx中,可以看到:

...示例创建根树节点以分配子树节点。将 ArrayList 中每个 Customer 对象的子树节点添加到根树节点中,以及为分配给 Customer 对象的每个 Order 对象添加一个子树节点。Customer 对象分配给 Tag 属性,并显示表示 Customer 对象的树节点的橙色文本。此示例要求定义 Customer 和 Order 对象,一个 Form 上的 TreeView 控件以及一个名为 customerArray 的包含 Customer 对象的 ArrayList。


1

你可以创建自己的继承自TreeNode的类:

class MyNode : TreeNode {
    public int number {get; set;}
}

但是当您从树中检索节点时,您将进行强制转换,这与强制转换标记属性没有任何改进。而且您应该重写Clone()方法。

更清晰的方法是利用TreeNode.Name,并将其作为字典中的键来查找您的自定义数据。当CustClass变得非常复杂时,这种方法很好。Name属性不用于其他任何事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接