2011-01-25 31 views
2

特定のイベントでポップアップするフォームがあります。配列からボタンを作成し、Tag値を特定の値に設定します。したがって、このボタンを押すかクリックする場合、関数はタグ値を返します。押されたボタンから戻り値を取得する

どうすればいいですか?そして、どのボタンがクリックされたかをどのように知ることができますか? この時点でコードはDialogResultを返しますが、関数からタグ値を返したいとします。これを行うためにコードを変更するにはどうすればよいですか?

public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray) 
{ 
    Form form = new Form(); 

    Button[] buttonArray; 
    buttonArray = new Button[5]; 

    form.Text = title; 

    for (int i = 0; i < btnArray.Length; i++) 
    { 
     buttonArray[i] = new Button(); 
     buttonArray[i].Text = btnArray[i]; 
     buttonArray[i].Tag = new int(); 
     buttonArray[i].Tag = btnValueArray[i]; 

     buttonArray[i].TabStop = false; 
     buttonArray[i].Location = new System.Drawing.Point(0, i * 40); 
     buttonArray[i].Size = new System.Drawing.Size(240, 40); 
    } 

    form.ClientSize = new Size(240, 268); 
    form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] }); 
    form.FormBorderStyle = FormBorderStyle.FixedDialog; 
    form.StartPosition = FormStartPosition.CenterScreen; 
    form.MinimizeBox = false; 
    form.MaximizeBox = false; 

    DialogResult dialogResult = form.ShowDialog(); 
    return dialogResult; 
} 

答えて

7

形でプライベート変数を追加します。

private object SelectedTag; 

は、ボタンのクリックハンドラを追加します。

private void Button_Click(object sender, EventArgs e) { 
    SelectedTag = ((Button)sender).Tag; 
} 

は、作成した各ボタンにハンドラを割り当てます。

.. 
buttonArray[i].OnClick += form.Button_Click; 
.. 

静的関数では、単にdialogresultの代わりにform.SelectedTagを返します。

2

すべてのボタンで同じクリックイベントを呼び出すことができます。その後、あなたのハンドラで:

private void ButtonClick(object sender, EventArgs args) 
{ 
    Button oButton = (Button) sender; 

    object data = oButton.Tag; 
} 
0

DialogResultプロパティは既にどのボタンがクリックされたかを示します。個々のボタンを別のDialogResultを返すように設定してから、その機能の下部にあるボタンを確認することができます。

そして、あなたが代わりにクリックしたボタンのTagプロパティを返したい場合、あなたは(TagプロパティがタイプObjectであるため)Objectに関数の戻り値を変更する必要があります。

+1

8つ以上のボタンがある場合はどうなりますか? (DialogResult enumには8つの値があります) –

+0

@Oscar:そうだとすれば、もう少し作業をする必要があります。まれに(ある場合は)フォームに8つ以上のボタンが含まれている必要があります。 –

+0

Microsoft Outlookを開くだけで、ツール>オプションに移動してください(最初のタブでのみ表示されます) –

0

ButtonClickイベントハンドラをTestFormに追加し、ボタンのタグをFormのタグに設定できます。 サンプルがあります。

メインフォーム:インスタンス、我々は選択ボックスダイアログで作成

 private void Form1_Load(object sender, EventArgs e) 
     { 
      Object tag; 
      SelectBox("test", new String[] { "One", "Two", "Three" }, new String[] {"one value", "Two value", "three value" }, out tag); 
      MessageBox.Show(tag.ToString()); 
     } 

     public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray, out Object tagValue) 
     { 
      TestForm form = new TestForm(); 

      Button[] buttonArray; 
      buttonArray = new Button[5]; 

      form.Text = title; 

      for (int i = 0; i < btnArray.Length; i++) 
      { 
       buttonArray[i] = new Button(); 
       buttonArray[i].Text = btnArray[i]; 
       buttonArray[i].Tag = new int(); 
       buttonArray[i].Tag = btnValueArray[i]; 

       buttonArray[i].TabStop = false; 
       buttonArray[i].Location = new System.Drawing.Point(0, i * 40); 
       buttonArray[i].Size = new System.Drawing.Size(240, 40); 
       // subscribe to button click event.. 
       // the handler is in TestForm 
       buttonArray[i].Click += form.HandleOnButtonClick; 
      } 

      form.ClientSize = new Size(240, 268); 
      form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] }); 
      form.FormBorderStyle = FormBorderStyle.FixedDialog; 
      form.StartPosition = FormStartPosition.CenterScreen; 
      form.MinimizeBox = false; 
      form.MaximizeBox = false; 

      DialogResult dialogResult = form.ShowDialog(); 
      // set the out args value 
      tagValue = form.Tag; 

      return dialogResult; 
     } 

がTestFormを:

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

     public void HandleOnButtonClick(Object sender, EventArgs e) 
     { 
      Button button = sender as Button; 

      if (button != null) 
       this.Tag = button.Tag; 
     } 
    } 

編集:

あなたは、すべてのボタンの値をキャプチャしたい場合は、Dictionary<String, Object>を公開タグプロパティ

関連する問題