c# - 正在将对象引用存储在控件的 Tag 属性中 OK

标签 c# winforms object

我正在为列表中的每个对象创建一组表单控件,是否可以在控件的 Tag 属性中存储对对象的引用?

我这样做是为了在控件上有一个通用的 Click 事件,这样当它们被单击时我可以更新它们所代表的对象中的一个字段。

所以点击处理程序看起来像这样。

private void Item_Clicked(object sender, system.EventArgs e)
{
     if(sender.GetType() == typeof(System.Windows.Forms.Label))
     {
          System.Windows.Forms.Label label = (System.Windows.Forms.Label)sender;
          MyObject myObject = label.Tag;
          myObject.Value = true;
     }
}

在这种情况下,这是可以接受的做法吗?还是有更好的方法来处理这个问题?

最佳答案

是的,这是合法的,并且是 Tag 属性设计的模式之一。

这里最大的危险是另一段代码试图将相同的 Tag 属性用于他们自己的功能。这将为 Tag 属性创建一个竞争并导致运行时错误。一种更安全的方法是使用 Dictionary 实例在 LabelMyObject 之间创建私有(private)映射。

private Dictionary<Label,MyObject> _map = new Dictionary<Label,MyObject>();
...
private void Item_Clicked(object sender, system.EventArgs e) 
{ 
     if(sender.GetType() == typeof(System.Windows.Forms.Label)) 
     { 
          System.Windows.Forms.Label label = (System.Windows.Forms.Label)sender;
          MyObject myObject = _map[label];
          myObject.Value = true; 
     } 
}

这种方法有 Dictionary 的额外开销,但会生成更可靠的代码(恕我直言)。

关于c# - 正在将对象引用存储在控件的 Tag 属性中 OK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927067/

相关文章:

c# - 按字典顺序排序的字符串列表列表

iis-7.5 - 注册后允许用户浏览到 username.host.com

c# - 在 VB6 应用程序中托管 C# winforms

jquery - jQuery 的扩展是否在对象之间创建引用?

javascript - 基于 "category"属性和 sum "amount"属性减少对象数组

c# - 以独立于语言的方式检索性能计数器值

c# - 如何改进 C# 中 get 调用方法的代码

c# - StatusStrip 等效项

WinForms 选项卡控件替换可用于大量选项卡

java - Android java循环遍历对象列表