【问题标题】:C# dialogresult wont close formC# dialogresult 不会关闭表单
【发布时间】:2017-10-06 13:40:25
【问题描述】:

我正在开发一个需要登录的应用程序。

我开发了以下表格: -frmMain - frmLogon

Form main 在引导 Windows 窗体应用程序时启动。在主窗体的“显示”事件中,FrmLogon 窗体显示为对话框。

但是,当自动将 DialogResult 设置为 OK 时,表单不会关闭,程序仅在手动点击“登录”按钮时才有效,这会触发完全相同的功能。

我尝试关闭()表单登录,但这给我留下了 System.ObjectDisposedException。

有什么建议吗?

FrmMain.CS

private void OnFormShown(object sender, EventArgs e)
    {
        OnClickMenuLogon(sender, e);
    }

private void OnClickMenuLogon(object sender, EventArgs e)
        {
            if (IsLoggedOn())
            {
                G.LogOff();
                User = null;
                OnLoggedOff();
            }
            else
            {
                FrmLogon logon = new FrmLogon(G, true);
                DialogResult result = logon.ShowDialog();
                if (result == DialogResult.OK)
                {
                    User = logon.User;
                    _hostName = User.Name + " @ " + (String.IsNullOrEmpty(logon.HostName) ? Environment.MachineName : logon.HostName);
                    OnLoggedOn();
                }
            }
        }

FrmLogon.CS

private void OnLogOnSuccess(object sender, LoggedOnEventArgs e)
    {
        tbStatus.Text = $"[{DateTime.Now.ToString("HH:mm:ss")}]: Successfully logged on.\r\n" + tbStatus.Text;
        User = _g.LoggedUser;
        HostName = tbHost.Text;
        DialogResult = DialogResult.OK;
    }

编辑:使用时

   this.DialogResult = DialogResult.OK;
this.Close();

出现以下异常: Exception screenshot

【问题讨论】:

  • 而不是 DialogResult = DialogResult.OK;试试 this.Close();
  • @StephenWilson 根据Using DialogResult Correctly 不正确
  • @StephenWilson this.Close 将返回给他 DialogResult.Cancel
  • @stuartd 登录是异步的,事件处理程序在 FrmLogon 构造函数中配置。只要登录成功,就会调用该函数。在构造函数中,应用程序尝试自动登录,这会以某种方式导致问题。每当点击表单内的“登录”按钮而不是以编程方式这样做时,相同的登录功能确实可以工作。
  • 不要在标题中添加 (SOLVED),撤消上一次编辑,如果您解决了自己的问题,请发布答案并在计时器允许您在两天后接受。

标签: c# winforms


【解决方案1】:

问题已解决,在 FrmLogon 的构造函数中进行了登录尝试,导致在表单初始化之前设置了 DialogResult。在实现“显示”事件并在 FrmLogon 中从那里调用功能后,问题就解决了。谢谢大家。

【讨论】:

    【解决方案2】:

    而不仅仅是使用

    DialogResult = DialogResult.OK;
    

    使用

    this.DialogResult = DialogResult.OK;
    this.Close();
    

    this.Close() 将关闭您的第二个表单并返回当前的DialogResult

    更新 1

    另一种方法是在对话框窗体中添加一些不可见的按钮,将其设置为AcceptButton并以这种方式执行点击:

        Button bt = new Button();
        bt.Click += new EventHandler((sender1,e1)=> {
            this.DialogResult = DialogResult.OK;
        });
        bt.FlatStyle = FlatStyle.Flat;
        bt.FlatAppearance.BorderColor = BackColor;
        bt.FlatAppearance.MouseOverBackColor = BackColor;
        bt.FlatAppearance.MouseDownBackColor = BackColor;
        this.Controls.Add(bt);
        this.AcceptButton = bt;
        bt.PerformClick();
    

    【讨论】:

    • 这不应该是必要的,这是问题的关键——正如文档所说 “如果表单显示为对话框,请使用 DialogResult 中的值设置此属性枚举为窗体设置对话框结果的值,隐藏模态对话框,并将控制权返回给调用窗体。"
    • @stuartd 是的,如果您设置了 AcceptButton 和 CancelButton,如 MSDN 示例中所示 msdn.microsoft.com/en-us/library/…
    • 我已经尝试过了,这给我留下了以下异常:“System.ObjectDisposedException: 'No access to a deleted object.'”,删除的对象是 FrmLogon 登录对象。
    • @StanHurks 可以使用异常的共享屏幕截图我确定它不是来自表单关闭。我已经用空表单尝试过它,它可以正常工作。
    • @StanHurks 你也可以分享你的 OnLoggedOn() 函数
    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2014-08-09
    相关资源
    最近更新 更多