2011-01-25 204 views
2

我有一個表單在特定事件中彈出。它從數組中繪製按鈕並將Tag值設置爲特定值。因此,如果您按下或單擊此按鈕,該功能應返回標籤值。從按下按鈕獲取返回值

我該怎麼做?我怎麼知道哪個按鈕被點擊? 此時代碼返回DialogResult,但我想從函數返回Tag值。我應該如何修改我的代碼才能做到這一點?

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; 
.. 

然後在你的靜態功能,只需返回form.SelectedTag而不是對話結果。

2

您可以爲所有按鈕調用相同的點擊事件。那麼在您的處理程序:

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

    object data = oButton.Tag; 
} 
0

DialogResult屬性已經告訴你哪個按鈕被點擊。您可以設置每個單獨的按鈕以返回不同的DialogResult,然後檢查該功能底部的那個按鈕。

如果您想要返回單擊按鈕的Tag屬性,則需要將函數的返回值更改爲Object(因爲Tag屬性的類型爲Object)。

+1

如果超過8個按鈕會怎麼樣? (DialogResult枚舉有8個可能的值) – 2011-01-25 09:26:23

0

您可以在TestForm中添加ButtonClick事件處理程序,將按鈕的標記設置爲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>標籤屬性。