C# 我如何从一个已取消的登录表单中清晰地短路我的应用程序,并在登录成功时调用我的主表单?
我有一个在主窗体之前显示的登录窗体,在Program.cs中使用以下代码: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)
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()代码>