2012-06-18 50 views
2

我有一種情況,不知道我的方法是否正確,請引導我完成此操作。 假設我有一個包含中有許多控制Panel控件, 在運行時我用 Panel1.Controls財產進行了在面板中的每個控制迭代, 現在,在那些控制他們可以是任何東西TextBoxButtonDropDown等 現在我想在運行時查找哪些控件屬於哪種類型,然後查找該控件中是否包含任何特定屬性,如果該屬性在那裏存在,則設置該屬性的值。 我想我會在這裏使用Reflection做一些事情,但不知道從哪裏開始。在運行期間獲取對象的成員

示例代碼:

foreach (Control cntrl in Panel1.Controls) 
     { 
      //find type of the control 
      // find any specific property's existence in that control 
      // if property exists than set value of that property 
     } 

其他任何有關的做法受到歡迎也爲在運行時執行此任務。

對不起,我忘了提 我不想在這裏使用is關鍵字,因爲控制是5種,我想創建可用於與任何面板知道類型的存在控制全局函數在該小組中。

Thankx提前。

+3

您能否提供關於您想知道哪些屬性以及您是否知道預先感興趣的屬性的更多具體細節?你可能*不需要反思。 –

+1

你能詳細說明最後一部分嗎?你究竟是什麼意思,爲什麼你不想使用'is'? – TJHeuvel

回答

2

通過使用反射,你可以做到這一點。

Get the metadata for the property,然後設置它。這將允許你檢查的財產的存在,並驗證它可以設置:

foreach (Control cntrl in Panel1.Controls) 
{ 
    PropertyInfo prop = cntrl.GetType().GetProperty("Name", BindingFlags.Public |   BindingFlags.Instance); 
    if(null != prop && prop.CanWrite) 
    { 
     prop.SetValue(cntrl, "MyName", null); 
    } 
} 

或者試試這個,如果你不想使用反射

foreach (Control cntrl in Panel1.Controls) 
      { 
       if(cntrl is TextBox) 
       { 
        TextBox txt = (TextBox)ctrl; 
        txt.Text = "Your value here"; 
        // your textbox code here 
       } 
       else if(cntrl is DropDown) 
       { 
        // your DropDown code here 
       } 
       if(cntrl is Button) 
       { 
        // your Button code here 
       } 
      } 

注:關鍵字檢查對象是否與給定類型兼容。例如,下面的代碼可確定如果一個對象是爲MyObject類型的實例,或從MyObject的派生的類型:

+0

plz查看我的問題我剛剛編輯它,我不想使用'is'關鍵字 – yogi

+0

@ yogi:檢查我更新的答案,它可能會幫助你... – Talha

+1

是的,一個與反射適合我,感謝名單。但我也發佈了類似的內容,但我的更冗長,你看起來更苗條:) – yogi

0

關鍵字is您要找的是不是。

foreach(Control ctrl in Panel1.Controls) 
{ 
if(ctrl is TextBox) //Is the control of type TextBox? 
{ 
    (TextBox)ctrl.Text = "TextBox Test!"; //Cast it to a TextBox 
} else if(ctrl is Button) //Is the control of type Button? 
{ 
    (Button)ctrl.Text = "Button Test!"; 
} 
} 

有2種鑄造方式從A型到B型;

(TextBox)ctrl 

ctrl as TextBox; 

所不同的是第一種方法,如果轉換失敗拋出異常,所述第二返回NULL。在你的情況下,你很確定它的類型是正確的,所以你使用的並不重要。

+1

這可能是一個稍微令人混淆的例子,因爲'.Text'是'Control'的一個屬性... –

+0

它非常直觀,它展示瞭如何根據對象的類型派生代碼。沒有多少按鈕或文本框的特定屬性是非常直觀的。 – TJHeuvel

+0

使用'is'則'as'非常奇怪。既可以使用'as',然後檢查null,或者'is',然後使用cast。 –

0

可以使用OfType擴展名:

List<TextBox> textBoxes = myPanel.Controls.OfType<TextBox>().ToList(); 
string allText = string.Join("\n", textBoxes.ConvertAll(t => t.Text)); 

上面的例子會發現然後面板中的所有TextBox控件將其文本讀入單個字符串。

-1

你可以嘗試如下,

using System.Reflection; // reflection namespace 
// get all public static properties of MyClass type 
PropertyInfo[] propertyInfos; 

foreach (Control cntrl in Panel1.Controls) 
{ 


if(cntrl is TextBox) 
{ 

propertyInfos = typeof(TextBox).GetProperties(BindingFlags.Public | 
               BindingFlags.Static); 
//Loop thru property info n find the name using PropertyInfo.Name 
if(property.Name == "property name") 
    //assign values 
} 
else 
{ 
    //others 
} 


} 
0

您可以使用Type.GetProperties法這樣的,從MSDN:

public class TypeMain 
{ 
    public static void Main() 
    { 
     Type myType =(typeof(MyTypeClass)); 
     // Get the public properties. 
     PropertyInfo[] myPropertyInfo = myType.GetProperties(BindingFlags.Public|BindingFlags.Instance); 
     Console.WriteLine("The mumber of public properties is {0}.", myPropertyInfo.Length); 
     // Display the public properties. 
     DisplayPropertyInfo(myPropertyInfo); 
     // Get the nonpublic properties. 
     PropertyInfo[] myPropertyInfo1 = myType.GetProperties(BindingFlags.NonPublic|BindingFlags.Instance); 
     Console.WriteLine("The number of protected properties is {0}.", myPropertyInfo1.Length); 
     // Display all the nonpublic properties. 
     DisplayPropertyInfo(myPropertyInfo1);  
    } 
    public static void DisplayPropertyInfo(PropertyInfo[] myPropertyInfo) 
    { 
     // Display information for all properties. 
     for(int i=0;i<myPropertyInfo.Length;i++) 
     { 
      PropertyInfo myPropInfo = (PropertyInfo)myPropertyInfo[i]; 
      Console.WriteLine("The property name is {0}.", myPropInfo.Name); 
      Console.WriteLine("The property type is {0}.", myPropInfo.PropertyType); 
     } 
    } 

的PropetyInfo類也有有益的性質一樣的CanRead,CanWrite。檢查出MSDN頁PropertyInfo

0

我自己找到了一個解決方案,請檢查它,並告訴我,從性能的角度來看它是否正確。

foreach (Control cntrl in Panel1.Controls) 
     { 
      System.Reflection.PropertyInfo[] props = cntrl.GetType().GetProperties(); 
      IEnumerable<System.Reflection.PropertyInfo> searchedProp = props.Where(delegate(System.Reflection.PropertyInfo p) 
                     { 
                      return p.Name.Contains("YourPropertyName"); 
                     }); 
      if (searchedProp != null && searchedProp.Count() > 0) 
       searchedProp.First().SetValue(cntrl, true, null); // Here true should be replaced by the value that is allowed by the property you are setting at runtime 
     } 
0

對於每個控件,獲取控件類型den的類型名稱。 通過反射獲得控制值,如果其期望值 對所需屬性執行設定值操作。

foreach (Control control in panel1.Controls) 
       { 

        Type controlType = control.GetType(); 
        switch (controlType.Name) 
        { 
         case "CheckBox": 
          if ((bool)controlType.GetProperty("Checked").GetValue(control,null)) 
           controlType.GetProperty("Name").SetValue(control,"Check1",null);       
          break; 
         case "TextBox": 
          //TODO 
          break; 
         case "ComboBox": 
          //TODO 
          break; 
         default: 
          break; 
        } 
       } 
      } 
相關問題