我有一个对话框,我希望在单击OK按钮时阻止关闭,但它会返回,即使AcceptButton属性设置为none而不是我的OK按钮。阻止它关闭的最佳方法是什么?
答案 0 :(得分:30)
事实上你正在改变错误的财产。你当然希望AcceptButton
成为OK按钮。此属性确定Windows术语中的默认按钮。这是您在键盘上按 ENTER 时按下的按钮。通过更改AcceptButton
,您只需将键盘界面分解为对话框。您不会以任何方式影响按下按钮时发生的情况。
您需要做的是将按钮的DialogResult
属性设置为DialogResult.None
,因为这决定了按钮是否关闭了表单。然后,在按钮的单击处理程序中,您需要决定如何响应按下按钮。我希望,如果对话框的验证成功,您应该通过设置表单的DialogResult
属性来关闭对话框。例如
private void OKbuttonClick(object sender, EventArgs e)
{
if (this.CanClose())
this.DialogResult = DialogResult.OK;
}
答案 1 :(得分:7)
停止此行为的最佳方法是在设计时将属性窗口中的“确定”按钮的DialogResult属性更改为DialogResult.None
。
此外,如果您在“确定”按钮的单击事件中已经有一些代码,则可以更改表格DialogResult。
private void comOK_Click(object sender, EventArgs e)
{
// your code .....
// Usually this kind of processing is the consequence of some validation check that failed
// so probably you want something like this
if(MyValidationCheck() == false)
{
// show a message to the user and then stop the form closing with
this.DialogResult = DialogResult.None;
}
}
答案 2 :(得分:2)
您还需要删除按钮本身的DialogResult
,在按钮的属性窗口中将其设置为None
。
http://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx
如果此属性的DialogResult设置为除以外的任何内容 无,如果父表单是通过ShowDialog显示的 方法,单击按钮关闭父表单,而不是你的 连接任何事件。
显然,现在您的按钮不会执行任何操作,因此您需要为Click
事件注册处理程序。
答案 3 :(得分:1)
最佳做法是将Ok按钮设置为禁用,而不是不响应用户输入。
DialogResult属性应该设置为Ok或Yes,具体取决于表单,AcceptButton也应该链接到Ok。
我通常在所有对话框上创建一个函数,并在用户与数据交互时调用它。
void RefreshControls()
{
button.Enabled = this.ValidateInput();
}
答案 4 :(得分:-1)
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form2 fLogin = new Form2();
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form1());
}
else
{
Application.Exit();
}
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnKlik_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}