2010-10-13 67 views
1

我爲列表中的每個對象創建一組表單控件,是否可以在控件中存儲對象的引用標籤屬性?在控件中存儲對象引用標籤屬性確定

我這樣做,所以我可以對控制通用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; 
    } 
} 

這是在這種情況下可以接受的事情,還是有更好的方法來處理這種情況?

回答

5

是的,這是合法的,做的,是Tag財產被設計的模式之一。

這裏最大的危險是,另一個代碼peice的嘗試使用相同Tag財產爲自己的特點。這將爲Tag屬性創建一場競賽並導致運行時錯誤。更安全的方法是使用Dictionary實例在LabelMyObject之間創建私人地圖。

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的額外開銷,但會產生更可靠的代碼(恕我直言)

+0

如果我只使用標籤,那麼這種方法可行。我的例子是我正在做的事情的縮短版本。事實上,我有幾條if語句來確定點擊哪種類型的控件。在我的情況下,我應該創建一個像這樣的詞典Dictionary ? – Tester101 2010-10-13 19:18:23

+0

@ Tester101是的,如果你需要將控件(不僅僅是你的例子中的標籤)映射到MyObject,那麼這將工作 – 2010-10-13 20:54:27

+0

我認爲如果兩個或多個線程修改一個字典,你有與Tag屬性相同的問題。仍然是一個可行的解決方案,但你也可以使用Property Tag,對嗎? – Legends 2018-01-24 14:43:02

1

它是可以接受的,如果它適合你。我之前已經將標記存儲在標記中,並且它工作正常。需要考慮的事項:要存儲的對象的大小和對象的生命週期(可以在訪問之間進行處置或銷燬)。

另一種方法,我都用過,就是存儲「暗示」,這將有助於你retreive或重新創建的對象。例如,如果它是一個數據庫對象,則存儲Id屬性(可能是一個整數或Guid),該屬性遠遠小於對象本身。