2014-01-20 117 views
1

我有一個數據類(簡化的)使用變量來訪問類屬性

public class Transport 
{ 
    public int TransId; 
    public string TType; 
    public string Color; 
    public string Size; 
} 

Transport t1 = new Transport(); 
populate(t1) 

隨着其我一個視窗形式填充文本框控件。我的文本框具有相同的名稱(TransId, TType, Color, Size)。還有更多,所以我想要做的就是使用文本框的名稱來訪問數據。類似......

foreach (TextBox tb in this.Controls.OfType<TextBox>()) 
{ 
    tb.Text = t1.(tb.Name); 
} 

這可能嗎?這是一個好主意,還是應該堅持TransId.Text = t1.TransId等?

+5

_「它甚至是一個好主意」 _號反思會使這成爲可能,但你會失去編譯時的安全性。你不應該在可能改變的控制名稱上依賴你的業務邏輯。如果你真的需要你可以使用'Dictinary '來代替。 –

+0

@TimSchmelter你爲什麼不寫一個答案,並告訴他爲什麼它不是一個好主意呢? – TylerD87

+0

@ TylerD87對這個網站太具有建設性。他們更喜歡從我看到的東西中傲慢和諷刺。 – FlipTop

回答

3

我建議你的屬性值分配給手動(特別是如果你只想要顯示的值)控制或使用數據綁定到類屬性綁定到控件:

  • 選擇文本框的一個並轉到(數據綁定)財產
  • 對於Text結合選擇添加項目數據源...選項
  • 選擇對象數據源類型
  • 選擇Transport

這將增加transportBindingSource到您的應用程序。現在,您可以選擇每一個文本框,並從你的Transport對象綁定到屬性之一:

enter image description here

你現在需要的就是添加Transport實例綁定源:

private Transport transport; 

public Form1() 
{ 
    InitializeComponent(); 

    transport = new Transport { 
        TransId = 42, 
        Color = "White", 
        Size = "Big" 
        // ... 
       }; 

    transportBindingSource.Add(transport); 
} 

結果:

enter image description here

綁定的好處是,它可以雙向運行 - 當您在TextBox中編輯值時,傳輸對象屬性將被更新。


注意:考慮使用PropertyGrid如果你只是想顯示對象的所有屬性的值:

propertyGrid.SelectedObject = transport; 

enter image description here

+1

我已經提高了這一點,但你不斷更新它,並使其更好。 – Joe

+0

@JoeStead謝謝:)我保證不再讓它變得更好...... –

+1

@SergeyBerezovskiy這就是我所追求的,但遠遠超過我期待的!感謝您花時間和努力回答我的問題。 – FlipTop