16

我有一个对话框,我想阻止单击 OK 按钮时关闭,但它会返回,即使 AcceptButton 属性设置为 none 而不是我的 OK 按钮。阻止它关闭的最佳方法是什么?

4

5 回答 5

32

实际上,您正在更改错误的属性。你当然想AcceptButton成为确定按钮。此属性确定哪个是 Windows 术语中的默认按钮。那是当您敲击ENTER键盘时按下的按钮。通过更改AcceptButton,您只是破坏了对话框的键盘界面。您不会以任何方式影响按下按钮时发生的事情。

您需要做的是将DialogResult按钮的属性设置为,DialogResult.None因为这决定了按下按钮是否关闭表单。然后,在按钮的单击处理程序中,您需要决定如何响应按钮按下。我希望,如果对话框验证成功,您应该通过设置表单的DialogResult属性来关闭对话框。例如

private void OKbuttonClick(object sender, EventArgs e)
{
    if (this.CanClose())
        this.DialogResult = DialogResult.OK;
}
于 2012-04-26T09:46:30.043 回答
7

停止此行为的最佳方法是在设计时将 OK 按钮的 DialogResult 属性更改为DialogResult.None属性窗口中。

此外,如果您已经在 OK 按钮的单击事件中有一些代码,您可以更改表单 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;
    }
}
于 2012-04-26T09:44:30.400 回答
2

您还需要删除DialogResult按钮本身的 ,在按钮的属性窗口中将其设置为None

http://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx

如果此属性的 DialogResult 设置为 None 以外的任何值,并且如果父窗体是通过 ShowDialog 方法显示的,则单击该按钮将关闭父窗体,而无需连接任何事件。

显然,现在您的按钮不会执行任何操作,因此您需要为该Click事件注册一个处理程序。

于 2012-04-26T09:44:28.153 回答
1

最佳实践是实际将 Ok 按钮设置为禁用,而不是不响应用户输入。

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

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

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

于 2012-04-27T03:28:28.040 回答
-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();
        }
    }
于 2013-10-12T18:10:16.757 回答