2

親から MDI 子を実行したい。たとえば、子フォームに 3 つのテキスト ボックスがあります。最初の 2 つのテキスト ボックスに 2 つの値を追加し、3 番目に結果を書き込みます。これを行うために、親フォームにボタン(実行ボタンと呼びましょう)が必要です。また、他の計算を行う他の子フォームがあるため、実行ボタンがフォーカスされたフォームに従って動作するようにします。誰も私がそれを行う方法を知っていますか?

各子フォームに計算を行うメソッドを記述し、親フォームの実行ボタンでこのメソッドを呼び出しますが、これは子フォームのテキスト ボックス (つまり null) の値を認識しません。誰かが私を助けてくれたら最高です。

ありがとう

コードは非常に単純です。子フォームに 3 つのテキスト ボックスがあり、最初の 2 つにユーザー入力値があります。親フォームの実行ボタンをクリックすると、子フォームの 3 番目のテキスト ボックスの値が合計になります。最初の 2 つのテキスト ボックスの値の。親フォームから呼び出すことができる子フォームにこのメソッドがありますが、機能しません

public void AddValues()
        {
            double a = double.Parse(textBox1.Text);
            double b = double.Parse(textBox2.Text);
            textBox3.Text = (a + b).ToString();
        }

私が持っている親フォームで

private void button1_Click(object sender, EventArgs e)
        {
            ChildFrom child = new ChildFrom();
            child.AddValues();
        }
4

1 に答える 1

2

子フォームで:

public void AddValues() //add error handling
{
    double a = double.Parse(textBox1.Text);
    double b = double.Parse(textBox2.Text);
    textBox3.Text = (a + b).ToString();
}

親フォームAddValuesでは、開いている子フォームの同じインスタンスを呼び出す必要があります。つまり、親フォームでは次のようになります。

public partial class ParentForm : Form
{
    ChildForm _cF; //member field

    public ParentForm()
    {
        InitializeComponent();
    }

    private void OpenChildForm() //this is how you should open the form
    {                            //call this function in whichever event 
         _cf = new ChildForm();  //you are opening the child form.
         _cf.Show();
    }   

    private void button1_Click(object sender, EventArgs e)
    {
        //please remove these lines, its wrong!
        //ChildFrom child = new ChildFrom();
        //child.AddValues();

        //do this instead:
        _cf.AddValues();
    }
}

ここで重要なのは、子フォームの同じインスタンスを操作することです。全体で必要な場合は、親フォームのメンバー フィールドにします。

編集: 子フォームをメンバー変数にしたくない場合は、C# のクロージャーに頼ることができます。

親フォーム:

private void OpenChildForm()
{
     ChildForm cf = new ChildForm();
     cf.Show();

     btnRun.Clicked -= OnRunButtonClicked(cf); //important - to avoid multiple-
     btnRun.Clicked += OnRunButtonClicked(cf); //handlers getting attached.
}  

private EventHandler OnRunButtonClicked(ChildForm cf)
{
    return (sender, e) => cf.AddValues();
}

btnRun初期化部分から既存のクリック ハンドラーを削除するように注意してください。

于 2012-10-31T06:57:48.233 に答える