我正在尝试制作自定义MessageBox。我正在使用私有构造函数和静态“show”方法调用一个简单的表单。根据用户传入的内容,它将动态创建一个OK和可能的取消按钮。我在创建按钮时创建Click事件处理程序。 我想知道的是如何将DialogResult传递给调用者。 这是创建按钮(show)和事件处理程序的代码。
public static DialogResult Show(string title, string message, ButtonStyle buttonStyle) {
AFGMessageBox box = new AFGMessageBox();
box.Text = title;
box.LblMessage.Text = message;
if (buttonStyle == ButtonStyle.Ok) {
Button okButton = new Button {
Width = 93,
Height = 40,
Location = new Point(x: 248, y: 202),
Text = "OK"
};
okButton.Click += new EventHandler(OkButtonEventHandler);
}
return _result;
}
private static void OkButtonEventHandler(object sender, EventArgs e) {
_result = DialogResult.OK;
}
答案 0 :(得分:3)
您甚至不需要处理点击事件。您所需要的只是设置您创建的按钮的Button.DialogResult Property,如文档
中所述<强>说明强>
如果此属性的 DialogResult 设置为无以外的任何内容,并且通过 ShowDialog 方法显示父表单,单击该按钮可关闭父表单,而无需连接任何事件。然后,单击按钮时,窗体的 DialogResult 属性将设置为按钮的 DialogResult 。 例如,要创建“是/否/取消”对话框,只需添加三个按钮并将其 DialogResult 属性设置为是,否 ,和取消。
我认为这是自我解释的,但为了以防万一,这里是您的示例代码的修改版本
public static DialogResult Show(string title, string message, ButtonStyle buttonStyle) {
AFGMessageBox box = new AFGMessageBox();
box.Text = title;
box.LblMessage.Text = message;
if (buttonStyle == ButtonStyle.Ok) {
Button okButton = new Button {
Width = 93,
Height = 40,
Location = new Point(x: 248, y: 202),
Text = "OK",
DialogResult = DialogResult.OK
};
box.Controls.Add(okButton);
}
return box.ShowDialog();
}
答案 1 :(得分:0)
按如下方式更改方法AFGMessageBox.Show
:
public static DialogResult Show(string title, string message, ButtonStyle buttonStyle) {
AFGMessageBox box = new AFGMessageBox();
box.Text = title;
box.LblMessage.Text = message;
if(buttonStyle == ButtonStyle.Ok) {
Button okButton = new Button {
Width = 93,
Height = 40,
Location = new Point(x: 248, y: 202),
Text = "OK"
};
box.Controls.Add(okButton); // add the button to your dialog!
okButton.Click += (s, e) => { // add click event handler as a closure
box.DialogResult = DialogResult.OK; // set the predefined result variable
box.Close(); // close the dialog
};
}
return box.ShowDialog(); // display the dialog! (it returns box.DialogResult by default)
}