Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何从一个已取消的登录表单中清晰地短路我的应用程序,并在登录成功时调用我的主表单?_C#_Forms_Compact Framework_Windows Ce_Application Shutdown - Fatal编程技术网

C# 我如何从一个已取消的登录表单中清晰地短路我的应用程序,并在登录成功时调用我的主表单?

C# 我如何从一个已取消的登录表单中清晰地短路我的应用程序,并在登录成功时调用我的主表单?,c#,forms,compact-framework,windows-ce,application-shutdown,C#,Forms,Compact Framework,Windows Ce,Application Shutdown,我有一个在主窗体之前显示的登录窗体,在Program.cs中使用以下代码: static void Main() { AppDomain.CurrentDomain.UnhandledException += Unhandled; frmLogin loginForm; using (loginForm = new frmLogin()) { if (loginForm.ShowDialog() == DialogResult.OK)

我有一个在主窗体之前显示的登录窗体,在Program.cs中使用以下代码:

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += Unhandled;
    frmLogin loginForm;
    using (loginForm = new frmLogin())
    {
        if (loginForm.ShowDialog() == DialogResult.OK)
        {
            NRBQConsts.userName = loginForm.UserName;
            NRBQConsts.pwd = loginForm.Password;
            NRBQConsts.currentSiteNum = loginForm.SiteNumber;
        }
        else
        {
            Application.Exit(); // klang!
        }
    }
    Application.Run(new frmMain());
}

static void Unhandled(object sender, UnhandledExceptionEventArgs exArgs)
{
    ExceptionLoggingService.Instance.WriteLog(String.Format("From 
application-wide exception handler: {0}", exArgs.ExceptionObject));
}
如果用户选择“关闭”按钮(而不是尝试登录),则登录表单应关闭,主表单不应显示,应用程序应关闭。如果用户选择“OK”按钮,则登录表单应关闭,然后显示主表单

所发生的事情是,选择“关闭”按钮会导致应用程序在铿锵、锣秀式的“崩溃”声中崩溃。我的日志文件中有此异常消息:

日期:2009年4月9日下午8:57:51 消息:已到达frmLogin.buttonOK_单击 日期:2009年4月9日下午8:57:51 消息:来自应用程序范围的异常处理程序:System.NullReferenceException:NullReferenceException 在NRBQ.frmLogin.GetSiteNum()处 在NRBQ.frmLogin.button单击(对象发送者,事件参数e) 在System.Windows.Forms.Control.OnClick(EventArgs e)中 在System.Windows.Forms.Button.OnClick(EventArgs e)中 在System.Windows.Forms.ButtonBase.WnProc(WM-WM、Int32-wParam、Int32-lParam) 在System.Windows.Forms.Control.\u InternalWnProc(WM WM、Int32 wParam、Int32 lParam) 在Microsoft.AGL.Forms.EVL.EnterModalDialog(IntPtr hwnModal)上 在System.Windows.Forms.Form.ShowDialog()中 在NRBQ.Program.Main()处

以下是登录表单中的相关代码:

public partial class frmLogin : Form
{
    public string UserName { get { return textBoxUsername.Text; } }
    public string Password { get { return textBoxPwd.Text; } }
    public string SiteNumber { get { return GetSiteNum(); } }

    private string GetSiteNum()
    {
        String candidateSiteNum = 
    listBoxSitesWithFetchedData.SelectedItem.ToString();
        if (String.IsNullOrEmpty(candidateSiteNum))
        {
            candidateSiteNum = "42"; // TODO: Remove before deploying
        }
        return candidateSiteNum;
    }

    public frmLogin()
    {
        InitializeComponent();
    }

    private void buttonClose_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached 
    frmLogin.buttonClose_Click");
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached 
    frmLogin.buttonOK_Click");
        if (SanityCheck())
        {
            this.Close(); // closing this login form should make the main 
    form active/visible
        }
        else
        {
            MessageBox.Show("You have not yet provided some key data; be 
    sure to enter a username and a password");
        }
    }

    private bool SanityCheck()
    {
        // For now, anyway, no site has to be selected; if none, use "42" by 
    default
        return ((!(String.IsNullOrEmpty(textBoxUsername.Text.Trim())))
            && (!(String.IsNullOrEmpty(textBoxPwd.Text.Trim()))));
    }
注:“确定”按钮的DialogResult设置为“确定”;“关闭”按钮的DialogResult设置为“取消”

为什么Application.Exit()会导致应用程序崩溃?终止应用程序的更温和的方式是什么

为什么选择OK按钮不允许随后显示主窗体?登录表单确实会关闭,即使在选择OK按钮时也是如此(如果健全性检查通过),但仅此而已……主表单不会显示

更新 我根据下面的答案修改了我的代码,现在“取消”功能正常(关闭应用程序时不会出现klang/crash),但在选择登录表单上的“OK”按钮后,我仍然看不到我的主表单,即使我正在编程将登录表单代码中的DialogResult设置为OK

相关代码如下

PROGRAM.CS

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += Unhandled;
    frmLogin loginForm;
    using (loginForm = new frmLogin())
    {
        if (loginForm.ShowDialog() == DialogResult.OK)
        {
            HHSConsts.userName = loginForm.UserName;
            HHSConsts.pwd = loginForm.Password;
            HHSConsts.currentSiteNum = loginForm.SiteNumber;
            // TODO: Verify that these vals are valid
            Application.Run(new frmMain());
        }
    }
}
FRMLOGIN.CS

private void buttonClose_Click(object sender, EventArgs e)
{
    ExceptionLoggingService.Instance.WriteLog("Reached 
frmLogin.buttonClose_Click");
    this.DialogResult = DialogResult.Cancel; // <= necessary?
    this.Close();
}

private void buttonOK_Click(object sender, EventArgs e)
{
    ExceptionLoggingService.Instance.WriteLog("Reached 
frmLogin.buttonOK_Click");
    this.DialogResult = DialogResult.OK; 
    if (SanityCheck())
    {
        this.Close();
    }
    else
    {
        MessageBox.Show("You have not yet provided some key data; be 
sure to enter a username and a password");
    }
}
…我看不到,所以它爆炸了:

String candidateSiteNum = listBoxSitesWithFetchedData.SelectedItem.ToString();
…在选择此登录表单上的“确定”按钮后立即退出。

这是
应用程序上的说明。退出

通知所有消息泵它们必须终止,然后在处理消息后关闭所有应用程序窗口

这意味着它将启动一个良好的受控关机,而不是立即退出,导致您的代码继续
应用程序

一种选择是使用
Environment.Exit
,它将立即终止,但这是一个混乱的解决方案。另一个选项是
应用程序之后立即返回
。退出
,这样您就永远不会到达
应用程序。运行
。但还是不太好

相反,只需尝试:

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += Unhandled;
    frmLogin loginForm;
    using (loginForm = new frmLogin())
    {
        if (loginForm.ShowDialog() == DialogResult.OK)
        {
            NRBQConsts.userName = loginForm.UserName;
            NRBQConsts.pwd = loginForm.Password;
            NRBQConsts.currentSiteNum = loginForm.SiteNumber;
            Application.Run(new frmMain());
        }
    }
}
Main
返回也将退出应用程序,因此不需要其他操作

编辑:显然这不是您遇到的问题,但无论如何,这回答了标题中的问题。

这是
应用程序上的说明。退出

通知所有消息泵它们必须终止,然后在处理消息后关闭所有应用程序窗口

这意味着它将启动一个良好的受控关机,而不是立即退出,导致您的代码继续
应用程序

一种选择是使用
Environment.Exit
,它将立即终止,但这是一个混乱的解决方案。另一个选项是
应用程序之后立即返回
。退出
,这样您就永远不会到达
应用程序。运行
。但还是不太好

相反,只需尝试:

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += Unhandled;
    frmLogin loginForm;
    using (loginForm = new frmLogin())
    {
        if (loginForm.ShowDialog() == DialogResult.OK)
        {
            NRBQConsts.userName = loginForm.UserName;
            NRBQConsts.pwd = loginForm.Password;
            NRBQConsts.currentSiteNum = loginForm.SiteNumber;
            Application.Run(new frmMain());
        }
    }
}
Main
返回也将退出应用程序,因此不需要其他操作


编辑:显然这不是您遇到的问题,但无论如何,这回答了标题中的问题。

看起来您从未在“确定”按钮中设置对话框结果

如下所示设置对话框结果:

this.DialogResult = DialogResult.OK;
在您进行健全性检查之后,就在
之前,this.Close()
应该可以解决该问题,因为该错误是由Null reff引起的


您还需要在表单返回的其他位置设置取消的结果(或者像我通常做的那样,在加载表单时,假设失败,直到您知道它成功并返回。)

看起来您从未在“确定”按钮中设置对话框结果

如下所示设置对话框结果:

this.DialogResult = DialogResult.OK;
在您进行健全性检查之后,就在
之前,this.Close()
应该可以解决该问题,因为该错误是由Null reff引起的

您还需要在表单返回的其他位置设置取消的结果(或者像我通常做的那样,在加载表单时,假设失败,直到您知道它成功并返回。)

不要对登录表单调用
Close()
,只需设置
对话框结果
,如下所示。还请注意,我没有设置对话框结果。在
SanityCheck()
告诉我们可以开始之前,请确定:

    private void buttonClose_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached frmLogin.buttonClose_Click");
        this.DialogResult = DialogResult.Cancel; 
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached frmLogin.buttonOK_Click");
        if (SanityCheck())
        {
            this.DialogResult = DialogResult.OK; 
        }
    }
您还应确保在
SanityCheck()
函数中选择了列表框中的项目:

    private bool SanityCheck()
    {
        if (listBoxSitesWithFetchedData.SelectedIndex == -1)
        {
            MessageBox.Show("You must select a site first!");
            return false;
        }

        bool pass = ((!(String.IsNullOrEmpty(textBoxUsername.Text.Trim())))
            && (!(String.IsNullOrEmpty(textBoxPwd.Text.Trim()))));
        if (!pass)
        {
            MessageBox.Show("You have not yet provided some key data; be sure to enter a username and a password");
        }

        return pass;
    }
不要对登录表单调用
Close()
,只需设置
DialogResult
如下。还请注意,我没有设置对话框结果。在
SanityCheck()
告诉我们可以开始之前,请确定:

    private void buttonClose_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached frmLogin.buttonClose_Click");
        this.DialogResult = DialogResult.Cancel; 
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
        ExceptionLoggingService.Instance.WriteLog("Reached frmLogin.buttonOK_Click");
        if (SanityCheck())
        {
            this.DialogResult = DialogResult.OK; 
        }
    }
您还应确保在
SanityCheck()
函数中选择了列表框中的项目:

    private bool SanityCheck()
    {
        if (listBoxSitesWithFetchedData.SelectedIndex == -1)
        {
            MessageBox.Show("You must select a site first!");
            return false;
        }

        bool pass = ((!(String.IsNullOrEmpty(textBoxUsername.Text.Trim())))
            && (!(String.IsNullOrEmpty(textBoxPwd.Text.Trim()))));
        if (!pass)
        {
            MessageBox.Show("You have not yet provided some key data; be sure to enter a username and a password");
        }

        return pass;
    }

尝试只添加一个
boolshowform=true在顶部向上-然后代替
Application.Exit()