-1

フォームが読み込まれている間に、C# (visual studio 2010) でフォームのコントロールに割り当てられている値を変更したいと考えています。フォームをエンド ユーザーに表示する必要がありますが、サーバーからデータを取得すると同時に、同じデータをコントロールに反映させたいと考えています。(タイマー、スレッド、またはイベントを使用せずに)。

例: textBox1.text ="abc";

サーバーが「xyz」を送信している場合は、フォームが既に読み込まれている間よりもテストボックスの値が自動的に xyz に変更されます。

クリックやイベントなしで。

4

1 に答える 1

1

c# のプロパティがどのように機能するかを確認する必要があります。

Sharplab.io で単純なクラスを逆コンパイルすると、

    public class C {
    public int foo
    {get;set;}
}

コンパイルが常にバッキング フィールドと getter および setter メソッドを生成することがわかります。

したがって、イベントをトリガーしたくない場合は、イベントがトリガーされる可能性が最も高いため、これらのメソッドをバイパスする必要があります。

これは、通常は非常に簡単に実行できるリフレクションで実行できるはずです。BUT Textbox には、その Text-Property に簡単にアクセスできるバッキング フィールドがないようです。ほとんどの場合、プライベート StringSource フィールドによって設定されます。これは、内部型 StringSource からのものです。そのため、まず型を取得する必要があります。コンストラクターへの参照を取得し、これを呼び出してプライベート フィールドを設定します。

これは私がどこまで来たかです:

    private int number = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        number++;

        this.textBox1.Text = number.ToString();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        number++;

        Type cTorType = typeof(string[]);
        string[] cTorParams = new string[] { number.ToString() };

        Type type = this.textBox1.GetType().GetRuntimeFields().ElementAt(11).FieldType;
        ConstructorInfo ctor = type.GetConstructor(new[] { cTorType });
        object stringSourceInstance = ctor.Invoke(new[] { cTorParams });

        this.textBox1.GetType().GetRuntimeFields().ElementAt(11).SetValue(this.textBox1, stringSourceInstance);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        MessageBox.Show("Changed!");
    }

セッターメソッドのトリガーをバイパスするために変更できるフィールドまたはプロパティがどこかにある必要があるため、リフレクションをもう少し掘り下げて、 typeof(TextBox).GetFields / .GetProperties を使用して TextBox クラスで何が見つかるかを確認することをお勧めします行事。

お役に立てれば。

于 2018-01-23T14:40:58.697 に答える