.Net Control.Tag - 常见和不寻常的用途

时间:2011-04-05 00:58:04

标签: .net controls

随着我的计划的成长和发展,我发现我越来越多地使用Control.Tag。我不太确定为什么微软把它放在那里,但我发现它非常有用。

我想知道:他们最初的目的是什么?什么被认为是可接受的,什么被认为是禁忌?

根据MSDN,Control.Tag“获取或设置包含控件数据的对象。”

在我的日历应用程序中,我存储Appointment代表的实际AppointmentControl对象。我怀疑这是它的预期用途,MSDN上的例子似乎证实了这一点,但我也做了一些不寻常的事情。

例如,当我有一个后退/下一对按钮时,我想在我们到达开始时被禁用,然后在我们到达结尾时被禁用,然后我将下一个按钮存储在标签中上一个,以及下一个标签中的上一个按钮。这样,我总是可以在点击时设置((Button)Tag).Enabled = true(因为当您向后移动时,显然已启用已禁用的下一个按钮,反之亦然)。

此外,我的日历由(视觉上)二维面板阵列组成。我在DateTime中存储每个面板对应的Panel.Tag,当用户放大以查看一天中的时间时,构成每个时间段的面板在其标签中有一个TimeSpan代表插槽的开始时间。

所以我很好奇:您认为Tag的最常见用途是什么?您使用过或看过的Tag有哪些更不寻常的应用?您是否会考虑将链接对象(如我的后面/下一个按钮示例中)存储为“hacky”?

有些人反对使用标签,暗示他们是旧语言的残余。一个常见的抱怨是,最好简单地扩展一个控件,使其包含一个强类型对象,而不是任何需要在使用时进行转换的对象。你觉得怎么样?

1 个答案:

答案 0 :(得分:5)

这来自VB6,它的控件也有Tag属性。它是类中字段的非常差的替代品,因为Tag类型为Object,所以它不是类型安全的。使您的代码难以阅读,它具有非特定的名称。如果需要它与控件关联,则使用继承。从控件类型派生类并添加所需的属性。或者在表单中添加一个字段。