1

クラスの各プロパティの名前と値の型を含むこの配列があります...

public string[,] test = new string[,] 
    { 
        { "s", "ID", "textBox" }, 
        { "s", "Status", "" }, 
        { "s", "User", "" }, 
        { "s", "JobTitle", "textBox" }, 
        { "s", "Number", "textBox" }, 
        { "s", "Club", "" },

私のフォームのすべてのテキストボックスは「txt」で始まるので、すべてのテキストボックス名を動的に持つことができます..

            for (int i = 0; i < (mobile.test.Length / 3); i++)
            {
                if (mobile.test[i, 2] == "textBox")
                {
                    TextBox tb = new TextBox();
                    string textBoxName = "txt" + mobile.test[i, 1];

そして、次のように、リフレクションを介して動的に classe プロパティ値を取得できます。

                    var type = mobile.GetType();
                    var property = type
                                     .GetProperty(mobile.test[i, 1])
                                     .GetValue(mobile);

したがって、私の目標は、すべてのテキストボックスにクラスプロパティ値を入力することですが、方法が見つからないようです...このようなことを試しましたが、テキストボックスの名前をオブジェクトに取得できません

                    object obj = tb
                               .GetType()
                               .GetProperty("Name")
                               .SetValue(tb, textBoxName); --> this doens't work

                    obj
                     .GetType()
                     .GetProperty("Text")
                     .SetValue(obj, Convert.ToString(property), null);

しかし、これは機能していません... :(

更新1:

わかりました、私はそれを次のように動作させました:

string textBoxName = "txt" + mobile.test[i, 1];
object[] tb = this.Controls.Find(textBoxName, true);
object obj = tb[0];
Type mobileType = mobile.GetType();
var property = mobileType.GetProperty(mobile.test[i, 1]).GetValue(mobile);

obj.GetType().GetProperty("Text").SetValue(obj, Convert.ToString(property), null);

それはうまくいきますが、それが最善の方法なのだろうか...?ありがとうございました

4

2 に答える 2

1

これは WinForms アプリケーションであるため、フォームの Controls コレクションにアクセスできます。上記のコード例に沿って、実際の TextBox を次のように実行できます。

var tb = this.Controls.OfType<TextBox>().FirstOrDefault(x => x.Name.Equals(textBoxName, StringComparison.InvariantCultureIgnoreCase));

if (tb != null)
{
    tb.Text = property; 
}

この例のプロパティは、ここで取得する値です。

var type = mobile.GetType();
                    var property = type
                                     .GetProperty(mobile.test[i, 1])
                                     .GetValue(mobile);

これが役立つことを願っています。

于 2013-09-17T12:33:44.067 に答える
1

あなたはリフレクションをやりすぎていると思います。コントロールの場所がわかっている場合は、そのControlsコントロールのコレクションを使用してテキスト ボックスを取得します。

foreach(var tb in parentControl.Controls.Where(c => c is TextBox))
    tb.Text = propVals[i++];

propVals既に取得している値のコレクションは どこにありますか。コレクションを列挙し続けるカウンターですiint

また、これを視覚的に見ると話しているので、テキストセットが必要だと思いました。ただし、あなたのコードでは、テキストボックスの名前を設定したいと思っています(これは視覚的ではありません)。あなたのコードが正確であれば、tb.Name = propVals[i++];代わりにそうするだけです。

または、複数のテキストボックスがあり、実際に名前を使用している場合は、次のようにします.Where(c => c.Name.StartsWith("txt")

最後に、parentControl.Controls再帰的ではないため、サブパネルなどには入りません。


編集: 理解できていない場合は申し訳ありませんが、これで理解が深まるかもしれません。

Type mobileType = mobile.GetType();
foreach(var tb in parentControl.Controls.Where(c => c is TextBox))
    tb.Text = mobileType.GetProperty(tb.Name).GetValue(mobile).ToString();
于 2013-09-17T12:34:45.863 に答える