1

Form1 には 12 個のボタンがあり、各ボタンの横にテキスト ボックスがあります。ボタン イベントは、form2 からのオブジェクトの取得とテキスト ボックスへの文字列値の配置を処理する dialogOpen というメソッドを呼び出します。

ユーザーがクリックしたボタンに応じて、返された値をテキストボックスに配置するにはどうすればよいですか? したがって、ユーザーがクリックしたのがボタン 1 の場合、返されたテキストは textbox1 に配置され、ユーザーがクリックしたボタン 2 の場合、返されたテキストは textbox2 に配置する必要があります。ボタンはすべて「参照」と呼ばれる可能性があるため、文字列名を使用してチェックすることは避けてください。

現在、以下のコードはそれを行っていますが、非常に反復的です。これを行う方が良いですか?

    private void dailogueOpen(String btnName)
    {
        if (listBox1.SelectedItem == null)
        {
            MessageBox.Show("Please Select a form");
        }
        else
        {
            var selectedItem = (FormItems)listBox1.SelectedItem;
            var form2result = new Form2(myDataSet, selectedItem);
            var resulOfForm2 = form2result.ShowDialog();

            if (resulOfForm2 == DialogResult.OK)
            {
                switch (btnName)
                {
                    case "btn1":
                        textBox1.Text = form2result.getValue();
                        break;
                    case "btn2":
                        textBox2.Text = form2result.getValue();
                        break;
                    case "btn3":
                        textBox3.Text = form2result.getValue();
                        break;
                    case "btn4":
                        textBox4.Text = form2result.getValue();
                        break;
                    case "btn5":
                        textBox5.Text = form2result.getValue();
                        break;
                }
            }
        }
    }


    private void button1_Click(object sender, EventArgs e)
    {
        String name = "btn1";
        dailogueOpen(name);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        String name = "btn2";
        dailogueOpen(name);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        String name = "btn3";
        dailogueOpen(name);
    }

    private void button4_Click(object sender, EventArgs e)
    {
        String name = "btn4";
        dailogueOpen(name);
    }

    private void button5_Click(object sender, EventArgs e)
    {
        String name = "btn5";
        dailogueOpen(name);
    }
4

7 に答える 7

2

編集: イベント ハンドラーに気付きました。さらにリファクタリングが続きます:

はいあります。テキストボックスをボタンに関連付ける必要があります。たとえば、次のように辞書を作成します。

Dictionary<Button, TextBox> _dict;

_dict[button1] = textBox1;
_dict[button2] = textBox2; 
...

すべてのイベントに対して 1 つのイベント ハンドラーを使用します。

private void button_click(object sender, EventArgs e)
{
    dialogeOpen((Button)sender);
}

dialogueOpen文字列の代わりにボタンを受け入れるように変更し、

 _dict[btn].Text = form2Result.getValue();
于 2012-09-19T12:59:30.140 に答える
1

最初に、ボタンのイベント ハンドラーを 1 つだけ使用します。次のようになります。

protected void ButtonClick(object sender, EventArgs e)
{
    Button clickedButton = (Button) sender;
    string selectedId = clickedButton.ID;
    string[] idParameters = selectedId.Split('_');
    string textBoxId = "textbox" + idParameters[1];
    dailogueOpen(textBoxId);
}

ここで行ったことは、テキストボックスの名前にパターンを使用することです。たとえば、button_1、button_2、...、button_n のような ID を持つボタンがある場合、対応するテキストボックスが何であるかを推測できます。

button_1 をクリックすると、その ID を分割することで、対応するテキストボックスが ID が textbox1 のものであることがわかります。

この場合、dialogOpen 関数は次のようになります。

private void dailogueOpen(string textBoxId)
{
    if (listBox1.SelectedItem == null)
    {
       MessageBox.Show("Please Select a form");
    }
    else
    {
        var selectedItem = (FormItems)listBox1.SelectedItem;
        var form2result = new Form2(myDataSet, selectedItem);
        var resulOfForm2 = form2result.ShowDialog();
        if (resulOfForm2 == DialogResult.OK)
        {
            TextBox textBox = (TextBox)this.Form.FindControl("MainContent").FindControl(textBoxId);
            textBox.Text = resulOfForm2.getValue();
    }
}

MainContent は、テキスト ボックスがあるコンテナーの ID です。

概して:

  • ボタンとテキストボックスのIDにパターンを使用します。
  • クリックされたボタンに応じて、対応する texbox id を推測します。
  • 次に、texbox を見つけて、その値を更新します。
于 2012-09-19T13:59:48.847 に答える
1

1same delegateすべてのbutton

Nota (Thank's to Marty) :フォーム デザイナにいるときは、すべてのボタンを選択してから、それらすべてに対して「Generic_Click」を割り当てるか、以下のコードを使用できます。

this.btn1.Click += new System.EventHandler(Generic_Click); //the same delegate
this.btn2.Click += new System.EventHandler(Generic_Click);
this.btn3.Click += new System.EventHandler(Generic_Click);
....


private void Generic_Click(object sender, EventArgs e)
{
     var control = (Button)sender;
     if(  control.Name == "btn1")
     {
        ....
     }
     else if(  control.Name == "btn2")
     {
        ....
     }
     else if(  control.Name == "btn3")
     {
        ....
     }


}
于 2012-09-19T12:58:49.200 に答える
1

イベントハンドラを次のように置き換えます

private void ButtonClick(object sender, EventArgs e)
{
    var button = sender as Button;
    if (button == null) return;
    String name = button.Text;// Tag, name etc
    dailogueOpen(name);
}
于 2012-09-19T12:59:03.707 に答える
0
  private void button_Click(object sender, EventArgs e)
        {

            Button button = sender as Button;
            if (button == null) return;
            String name = button.Text;// Tag, name etc


            dailogueOpen(name);
        }


     private void dailogueOpen(String btnName)
        {
            if (listBox1.SelectedItem == null)
            {
                MessageBox.Show("Please Select a form");
            }
            else
            {
                var selectedItem = (FormItems)listBox1.SelectedItem;
                var form2result = new Form2(myDataSet, selectedItem);
                var resulOfForm2 = form2result.ShowDialog();

                if (resulOfForm2 == DialogResult.OK)
                { 
                   SetTxt(btnName,form2result.getValue());
                }
            }
    }



      private void SetTxt(string btnName, string value)
            {
                int lenght = "Button".Length;
                string index = btnName.Substring(lenght); //remove Button
                TextBox t = (TextBox)this.Controls.Find("textBox" + index, true)[0];

                if (t != null)
                    t.Text = value;
            }
于 2012-09-19T13:27:55.130 に答える
0

すべてのボタンクリックで辞書と1つのイベントメソッドを持つことができます

Dictionary<Button, TextBox> dx = new Dictionary<Button, TextBox>;

private void ButtonClick(object sender, EventArgs e)
{
    var button = sender as Button;
    if (button == null) return;
    dx[button].Text = form2result.getValue();
}

コンストラクタは次のようになります。

public ClassName()
{
   dx.Add(button1, textBox1);
   dx.Add(button2, textBox2);
   dx.Add(button3, textBox3);
}
于 2012-09-19T13:01:07.783 に答える
0

最初にできることは、switch ステートメントの必要性をなくして読みやすさを改善することだと思います。

private void dailogueOpen(TextBox textBox)
{
    if (listBox1.SelectedItem == null)
    {
        MessageBox.Show("Please Select a form");
    }
    else
    {
        var selectedItem = (FormItems)listBox1.SelectedItem;
        var form2result = new Form2(myDataSet, selectedItem);
        var resulOfForm2 = form2result.ShowDialog();

        if (resulOfForm2 == DialogResult.OK)
        {
            textBox.Text = form2result.getValue();
        }
    }
}


private void button1_Click(object sender, EventArgs e)
{
    dailogueOpen(textBox1);
}

private void button2_Click(object sender, EventArgs e)
{
    dailogueOpen(textBox2);
}

private void button3_Click(object sender, EventArgs e)
{
    dailogueOpen(textBox3);
}

private void button4_Click(object sender, EventArgs e)
{
    dailogueOpen(textBox4);
}

private void button5_Click(object sender, EventArgs e)
{
    dailogueOpen(textBox5);
}

これにより、ディクショナリ (他の 2 人が提案) を導入して Button を TextBox にマップする合理的なメソッド シグネチャが得られます。これにより、すべてのボタンに対して単一のイベント ハンドラー (他の 2 人が提案) を使用できるようになります。

于 2012-09-19T13:23:56.183 に答える