2009-10-14 49 views
4

如何根據其類型來定位控件?如何通過類型訪問集合中的控件?

我具有由它的特定類型一個控制集合「TargetControls」

 List<Control> TargetControls = new List<Control>(); 
     foreach (Control page in Tabs.TabPages) 
     { 
      foreach (Control SubControl in page.Controls) 

       TargetControls.Add(SubControl); 
     } 

     foreach (Control ctrl in TargetControls)... 

我需要訪問的每個現有的控制(組合框,複選框等。)提供接入到其特定的性能。我現在做的方式只允許我訪問通用控件屬性。

無法指定像...

組合框電流=新組合框[ 「名稱」]; ///引用組合框「名稱」的實例

然後被授予訪問它的(已有的)屬性的操作權限?

回答

1

在訪問任何特定參數之前,您需要將控件轉換爲正確類型的控件。

ComboBox c = ctrl as ComboBox; 
If (c != null) 
{ 
    //do some combo box specific stuff here 
} 

你也可以在控件添加到一個通用的dictionary<string, control>和使用control.name爲重點那裏。

Ex。

Dictionary<string, Control> TargetControls = new Dictionary<string, Control>(); 
+0

謝謝,這正是我需要的。 ComboBox c = ctrl作爲ComboBox; 我現在明白並已經實施了鑄造。所有的解決方案看起來很酷,但這是最好的與我的代碼協調。 – zion 2009-10-14 20:13:42

0

爲了訪問控件的特定屬性,必須將其轉換爲適當的類型。例如,如果您的TargetControls集合中的項目是文本框,則必須說((TextBox)TargetControls[0]).Text = 'blah';

如果您提前不知道類型,則可以使用反射來訪問屬性,但我需要有一個更好的例子,你先試圖做什麼...

6

您可以使用關鍵字來檢查特定類型的控制。如果控件屬於特定類型,請執行類型轉換。

foreach (Control SubControl in page.Controls) 
{ 
    if (SubControl is TextBox) 
    { 
     TextBox ctl = SubControl as TextBox; 
    } 
} 
+0

+1不要讓任何人打你你應該如何使用'的as'代替'is'任何廢話,檢查' null'。 – MusiGenesis 2009-10-14 20:09:14

+0

我當然不會:) – Amirshk 2009-10-14 20:15:05

1

假設你可以使用LINQ,你要尋找的(比如說)按鈕控制:

var button = (from Control c in TargetControls 
       where c.Name == "myName" && c is Button 
       select c 
      ).FirstOrDefault(); 

...它會給你在一個名爲「MYNAME」的第一個按鈕控制你的如果不存在這樣的項目,則爲null。

1

那麼Find方法呢?

Button btn = (Button)this.Controls.Find("button1", true)[0]; 
      btn.Text = "New Text"; 
2

可以使用OfType<T>擴展方法:

foreach (var textBox = page.Controls.OfType<TextBox>()) { 
    // ... 
} 
相關問題