我有一个弹出特定事件的表单。它从数组中绘制按钮并将Tag值设置为特定值。因此,如果您要按或单击此按钮,该函数应返回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;
}
答案 0 :(得分:7)
在表单中添加一个私有变量:
private object SelectedTag;
添加按钮点击处理程序:
private void Button_Click(object sender, EventArgs e) {
SelectedTag = ((Button)sender).Tag;
}
将处理程序分配给您创建的每个按钮:
..
buttonArray[i].OnClick += form.Button_Click;
..
然后在静态函数中,只需返回form.SelectedTag
而不是对话结果。
答案 1 :(得分:2)
您可以为所有按钮调用相同的点击事件。然后在你的处理程序中:
private void ButtonClick(object sender, EventArgs args)
{
Button oButton = (Button) sender;
object data = oButton.Tag;
}
答案 2 :(得分:0)
DialogResult
属性已经告诉您单击了哪个按钮。您可以设置每个按钮以返回不同的DialogResult
,然后在函数底部检查该按钮。
如果要返回单击按钮的Tag
属性,则需要将函数的返回值更改为Object
(因为Tag
属性的类型为Object
})。
答案 3 :(得分: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;
}
我们在SelectBox对话框中创建其实例的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>
标签属性。