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た。そのパネルに存在するコントロールの種類を知らなくても、任意のパネルに使用できるグローバル関数を作成したいと考えています。

事前に感謝します。

4

7 に答える 7

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
                }
            }

注: isキーワード オブジェクトが特定のタイプと互換性があるかどうかを確認します。たとえば、次のコードは、オブジェクトが MyObject 型のインスタンスであるか、MyObject から派生した型であるかを判断できます。

于 2012-06-18T07:39:10.117 に答える
0

OfType拡張機能を使用できます:

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

上記の例では、パネル内のすべての TextBox コントロールを検索し、それらのテキストを 1 つの文字列に読み取ります。

于 2012-06-18T07:39:51.270 に答える
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
        }
于 2012-06-18T07:58:16.597 に答える
0

各コントロールについて、タイプの名前からコントロール タイプを取得します。その目的の値が目的のプロパティで値の設定操作を行う場合、リフレクションを介してコントロールの値を取得します。

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;
                    }
                }
            }
于 2012-06-18T09:02:57.463 に答える
0

MSDN から、次のように Type.GetProperties メソッドを使用できます。

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);
        }
    }

PropertyInfo クラスには、CanRead、CanWrite などの便利なプロパティもあります。PropertyInfoの MSDN ページをチェックしてください

于 2012-06-18T07:46:50.097 に答える
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!";
 }
}

タイプ A から B へのキャストには 2 つの方法があります。

(TextBox)ctrl

また

ctrl as TextBox;

違いは、最初のアプローチではキャストが失敗した場合に例外がスローされ、2 番目のアプローチでは null が返されることです。あなたの場合、それが正しいタイプであるとかなり確信しているので、どちらを使用しても大した問題はありません。

于 2012-06-18T07:37:33.843 に答える
-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
}


}
于 2012-06-18T07:41:28.020 に答える