2011-01-25 202 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>标签属性。