从按下按钮获取返回值
问题描述:
我有一个表单在特定事件中弹出。它从数组中绘制按钮并将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;
}
答
在窗体中添加一个私有变量:
private object SelectedTag;
添加一个按钮单击处理程序:
private void Button_Click(object sender, EventArgs e) {
SelectedTag = ((Button)sender).Tag;
}
指定您所创建的处理程序的每个按钮:
..
buttonArray[i].OnClick += form.Button_Click;
..
然后在你的静态功能,只需返回form.SelectedTag
而不是对话结果。
答
您可以为所有按钮调用相同的点击事件。那么在您的处理程序:
private void ButtonClick(object sender, EventArgs args)
{
Button oButton = (Button) sender;
object data = oButton.Tag;
}
答
DialogResult
属性已经告诉你哪个按钮被点击。您可以设置每个单独的按钮以返回不同的DialogResult
,然后检查该功能底部的那个按钮。
如果您想要返回单击按钮的Tag
属性,则需要将函数的返回值更改为Object
(因为Tag
属性的类型为Object
)。
答
您可以在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>
标签属性。
如果超过8个按钮会怎么样? (DialogResult枚举有8个可能的值) – 2011-01-25 09:26:23