防止ShowDialog()在单击“确定”按钮时返回

17

我有一个对话框,当单击“确定”按钮时,希望阻止它关闭,但它仍然关闭了,即使将AcceptButton属性设置为none而不是我的“确定”按钮。防止其关闭的最佳方法是什么?

5个回答

33
实际上,你改变的是错误的属性。你肯定希望AcceptButton是“确定”按钮。该属性决定了Windows中的默认按钮。当你按下键盘上的ENTER键时,就会按下该按钮。通过更改AcceptButton,你只是破坏了与你的对话框的键盘界面。你无论如何都不会影响按钮被按下后会发生什么。
你需要做的是将您的按钮的DialogResult属性设置为DialogResult.None,因为这是确定按钮是否关闭窗体的属性。然后,在按钮的单击处理程序内部,你需要决定如何响应按钮按下事件。我希望,如果对话框的验证成功,你应该通过设置窗体的DialogResult属性来关闭对话框。例如:
private void OKbuttonClick(object sender, EventArgs e)
{
    if (this.CanClose())
        this.DialogResult = DialogResult.OK;
}

7

阻止这种行为的最好方法是在设计时在属性窗口中将您的OK按钮的DialogResult属性更改为DialogResult.None

此外,如果您已经在OK按钮的click事件中编写了一些代码,您可以更改表单的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
您需要同时删除按钮本身的DialogResult,在属性窗口中将其设置为Nonehttp://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx 如果此属性的DialogResult设置为除None以外的任何值,并且如果父窗体是通过ShowDialog方法显示的,则单击该按钮将关闭父窗体,而无需连接任何事件。
显然,现在您的按钮不会执行任何操作,因此您需要注册Click事件的处理程序。

哇,没注意到有这样的东西。 - HasanG

1

最佳实践是将“确定”按钮设置为禁用,而不是不响应用户输入。

根据表单和 AcceptButton,DialogResult 属性应设置为 Ok 或 Yes,AcceptButton 也应链接到 Ok。

我通常在所有对话框上创建一个函数,并在用户与数据交互时调用它。

void RefreshControls() { button.Enabled = this.ValidateInput(); }


-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();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接