0

クラスにフォーム、ボタンなどを含むクラスを作成しまし。次に、クラスでそれらのハンドル イベントを作成します。以下の私のクラスコードを見てください:

        public static class InputBox
    {
        static Form form = new Form();
        static Label label = new Label();
        static TextBox textBox = new TextBox();
        static Button buttonOk = new Button();
        static Button buttonCancel = new Button();
        public static DialogResult Show(string title, string promptText, ref string value)
        {
            form.Text = title;
            label.Text = promptText;
            textBox.Text = value;

            buttonOk.Text = "OK";
            buttonCancel.Text = "Cancel";
            buttonOk.DialogResult = DialogResult.OK;
            buttonCancel.DialogResult = DialogResult.Cancel;

            label.SetBounds(9, 20, 372, 13);
            textBox.SetBounds(12, 36, 372, 20);
            buttonOk.SetBounds(228, 72, 75, 23);
            buttonCancel.SetBounds(309, 72, 75, 23);

            label.AutoSize = true;
            textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
            buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

            form.ClientSize = new Size(396, 107);
            form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });

            form.FormBorderStyle = FormBorderStyle.FixedDialog;
            form.StartPosition = FormStartPosition.CenterScreen;

            buttonOk.Click += new EventHandler(buttonOk_Click); //this is the handle code
            buttonCancel.Click += new EventHandler(buttonCancel_Click);//this is the handle code

            form.MinimizeBox = false;
            form.MaximizeBox = false;
            form.AcceptButton = buttonOk;
            form.CancelButton = buttonCancel;

            DialogResult dialogResult = form.ShowDialog();
            value = textBox.Text;
            return dialogResult;
        }

        static void buttonCancel_Click(object sender, EventArgs e)
        {
            form.Close();
        }

        static void buttonOk_Click(object sender, EventArgs e)
    {
        MessageBox.Show("If u click this, You Will Get many Messages as many as you call the class"); 
    }
    }

次に、自分のフォーム コードで次のように呼び出します。

string strbuffer; // Global Variable

        InputBox.Show("Hi..?", "What Is Your Name?",ref strbuffer);
            //do something...
            InputBox.Show("Hi..?", "What Is Your Age?",ref strbuffer);
            //do something
            InputBox.Show("Hi..?", "How Many Cars do you have?",ref strbuffer);
            //do something

クラスを呼び出した回数だけ呼び出した場合、古いハンドラーは破棄されないため、クラスを呼び出した回数だけハンドラー コントロールのコードが実行されます。

クラスがもう使用されていない場合、変数は処分されないので、呼び出すたびに変数が常に蓄積されると思います

このケースを解決する最善の方法は何でしょうか?

4

2 に答える 2

0

何を求めているのかわかりませんが、イベントに関連する問題がある場合は、イベントの割り当てを解除することをお勧めします。

static void buttonCancel_Click(object sender, EventArgs e)
{
        form.Close();
    buttonOk.Click -= new EventHandler(buttonOk_Click); 
        buttonCancel.Click -= new EventHandler(buttonCancel_Click);
}

static void buttonOk_Click(object sender, EventArgs e)
{
    MessageBox.Show("If u click this, You Will Get many Messages as many as you call the class"); 
    buttonOk.Click -= new EventHandler(buttonOk_Click); 
    buttonCancel.Click -= new EventHandler(buttonCancel_Click);
}
于 2012-12-19T14:02:53.927 に答える
0

ここでは、フォーム、ラベル、テキスト ボックスなどの静的変数を Show メソッドに移動しました。これは、このメソッドを呼び出すたびに、これらの新しいインスタンスを取得することを意味します。したがって、イベントはまだ関連付けられていません。

イベント ハンドラーは、静的フォーム (もう存在しない) を参照しないように変更する必要があったため、ボタンからフォーム インスタンスへの参照を取得しました。

public static class InputBox
        {

    public static DialogResult Show(string title, string promptText, ref string value)
    {
        Form form = new Form();
        Label label = new Label();
        TextBox textBox = new TextBox();
        Button buttonOk = new Button();
        Button buttonCancel = new Button();

        form.Text = title;
        label.Text = promptText;
        textBox.Text = value;

        buttonOk.Text = "OK";
        buttonCancel.Text = "Cancel";
        buttonOk.DialogResult = DialogResult.OK;
        buttonCancel.DialogResult = DialogResult.Cancel;

        label.SetBounds(9, 20, 372, 13);
        textBox.SetBounds(12, 36, 372, 20);
        buttonOk.SetBounds(228, 72, 75, 23);
        buttonCancel.SetBounds(309, 72, 75, 23);

        label.AutoSize = true;
        textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
        buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
        buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

        form.ClientSize = new Size(396, 107);
        form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });

        form.FormBorderStyle = FormBorderStyle.FixedDialog;
        form.StartPosition = FormStartPosition.CenterScreen;

        buttonOk.Click += new EventHandler(buttonOk_Click); //this is the handle code
        buttonCancel.Click += new EventHandler(buttonCancel_Click);//this is the handle code

        form.MinimizeBox = false;
        form.MaximizeBox = false;
        form.AcceptButton = buttonOk;
        form.CancelButton = buttonCancel;

        DialogResult dialogResult = form.ShowDialog();
        value = textBox.Text;
        return dialogResult;
    }

    static void buttonCancel_Click(object sender, EventArgs e)
    {
        (sender as Button).FindForm().Close();
    }

    static void buttonOk_Click(object sender, EventArgs e)
{
    MessageBox.Show("If u click this, You Will Get many Messages as many as you call the class"); 
}
}
于 2012-12-19T14:06:53.167 に答える