3

重複の可能性:
子フォームから親フォームのコントロールにアクセスする

親フォーム form1 と子フォーム test1 があります。親フォームのラベル テキストを親フォームの子フォームから変更したいです。showresult() メソッドがあります。

public void ShowResult() { label1.Text="hello"; }

label.Text="Bye";ボタンクリックイベントで子フォームtest1から変更したい。提案があれば教えてください。

4

3 に答える 3

8

子フォームを呼び出すときは、Parent子フォーム オブジェクトのプロパティを次のように設定します。

Test1Form test1 = new Test1Form();
test1.Show(this);

親フォームで、ラベル テキストのプロパティを次のようにします。

public string LabelText
{
  get
  {
    return  Label1.Text;
  }
  set
  {
    Label1.Text = value;
  }
}

子フォームから、そのようなラベル テキストを取得できます。

((Form1)this.Owner).LabelText = "Your Text";
于 2012-11-20T09:22:34.130 に答える
6

これを行うためのショートカットの方法はたくさんあることは間違いありませんが、私の見解では、親フォームが表示されるテキストを変更することを要求するイベントを子フォームから発生させるのが良いアプローチです。親フォームは、子が作成されたときにこのイベントに登録し、実際にテキストを設定することでそれに応答できる必要があります。

したがって、コードでは、これは次のようになります。

public delegate void RequestLabelTextChangeDelegate(string newText);

public partial class Form2 : Form
{
    public event RequestLabelTextChangeDelegate RequestLabelTextChange;

    private void button1_Click(object sender, EventArgs e)
    {
        if (RequestLabelTextChange != null)
        {
            RequestLabelTextChange("Bye");
        }
    }        

    public Form2()
    {
        InitializeComponent();
    }
}


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.RequestLabelTextChange += f2_RequestLabelTextChange;
    }

    void f2_RequestLabelTextChange(string newText)
    {
        label1.Text = newText;
    }
}  

それはもう少し長い風が吹いていますが、それはあなたの子供の形をその親の知識を持つことから切り離します。これは、子フォームを壊れることなく別のホスト(ラベルがない)で再び使用できることを意味するため、再利用に適したパターンです。

于 2012-11-20T09:24:04.077 に答える
0

次のようなことを試してください:

Test1Form test1 = new Test1Form();
test1.Show(form1);

((Form1)test1.Owner).label.Text = "Bye";
于 2012-11-20T09:22:46.240 に答える