C# 为什么应用程序抛出错误“;值不能为空";关于ShowDialog方法?
我花了5天时间试图解决这个问题,但我失败了 我是c#新手,我使用的是windows窗体。我构建了一个由20个表单组成的应用程序。应用程序从2个C# 为什么应用程序抛出错误“;值不能为空";关于ShowDialog方法?,c#,C#,我花了5天时间试图解决这个问题,但我失败了 我是c#新手,我使用的是windows窗体。我构建了一个由20个表单组成的应用程序。应用程序从2个表单开始(SplashScreen和MainForm)SplashScreen表单有计时器和进度条,MainForm有10个按钮,每个按钮打开其他表单。当此应用程序运行时,首先加载SplashScreen表单,当progressBar完成时,检查System.txt文件是否存在,如果存在,则加载MainForm表单: 溅屏形式: public partia
表单开始(SplashScreen
和MainForm
)SplashScreen
表单有计时器和进度条,MainForm
有10个按钮,每个按钮打开其他表单。当此应用程序运行时,首先加载SplashScreen
表单,当progressBar
完成时,检查System.txt
文件是否存在,如果存在,则加载MainForm
表单:
溅屏形式:
public partial class SplashScreen : Form
{
// This is a timer for progressBar:
private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if(progressBar1.Value==100)
{
timer1.Stop(); //it stops when progressBar completes.
CheckFile(); // this method will be called when progressBar completes
}
}
public void CheckFile()
{
if (File.Exists(@"C:\Folder1\System.txt"))
{
// if the file exist Main form will be opened
MainForm _MainForm = new MainForm();
this.Hide();
_MainForm.ShowDialog();
this.Close();
}
}
}
以下是程序运行9小时后抛出的错误:
问题是什么:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashScreen());
}
}
现在,当我运行程序时,SplashScreen
加载,然后它打开MainForm
(因为System.txt
存在),应用程序运行得很好,但是在运行应用程序整整9个小时后,它抛出错误“Value cannot be null”,并指向ShowDialog
方法(如屏幕截图所示)。请注意,即使我不使用该应用程序,也会发生错误(我只需按F5并等待9小时,直到错误发生)
当我首先将应用程序设置为使用MainForm
启动时(在Program.cs
上),应用程序可以正常工作很长时间,我的意思是它可以正常工作几天而不会出现此错误。只有当程序使用splashScreen
表单启动时才会发生错误(application.Run(new splashScreen())
)
我试图解决的问题是:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashScreen());
}
}
静态类程序
{
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新的SplashScreen());
}
}
- 我尝试了
Show()
方法而不是ShowDialog()
,应用程序抛出了相同的错误,但这次错误指向了application.Run(new SplashScreen())
(参见上文)
- 我还尝试了
MainForm\u MainForm=newmainform(){Owner=this};
- 我还尝试了
\u MainForm.ShowDialog(此);
- 我还尝试了
\u MainForm.ShowDialog();Application.DoEvents();
我尝试的所有操作都导致了相同的错误“Value cannot be null”,错误点位于\u MainForm.ShowDialog();
现在5天来,我一直在尝试解决这个问题,但我无法解决,每次我使用SplashScreen
运行应用程序时,它都会在9小时后(为什么是9小时?)出现这个错误。我知道变量可以为null而不是方法,那么ShowDialog
怎么可能为null?有人知道为什么ShowDialog
在长时间运行后会抛出错误吗?我很高兴听到其他关于如何从SplashScreen
打开MainForm
并保持其长时间打开的想法
请花5分钟来帮助我,我真的很绝望,每一个小小的帮助都可以解决这个问题。非常感谢高级版。为什么要将mainform作为模式加载?只有在模式方法返回时才会调用启动屏幕关闭,而模式关闭时才会调用启动屏幕关闭。请尝试使用\u mainform.Show()
您似乎多次执行MainForm\u MainForm=new MainForm()
。您可能不应该这样做,只需创建一次,每次需要时都使用同一个实例。@Wjdavis5.我对c不熟悉#我不知道您所说的模态是什么意思?我已经尝试过使用_MainForm.Show();但它会引发与我所说的相同的错误。您是否有堆栈跟踪?这可能会让您了解引发错误的原因。问题显然更深。问题(直接)不是Show
或ShowDialog
。他们不会抛出ArgumentNullException
。它必须由某个方法或构造函数抛出,该方法或构造函数在初始化后在MainForm
自身内执行。获取完整的stracktrace,并发布MainForm
自身的代码。。为什么要将MainForm作为模式加载?启动屏幕关闭时不会得到called直到模态方法返回,直到模态关闭才会发生。尝试使用\u mainForm.Show();
您似乎在执行mainForm\u mainForm=new mainForm()
多次。您可能不应该这样做,只需创建一次,每次需要时都使用相同的实例即可。@Wjdavis5.我对c不熟悉#我不知道您所说的模态是什么意思?我已经尝试使用_mainForm.Show();但它会引发与我所说的相同的错误。您是否有堆栈跟踪?这可能会让您了解引发错误的原因。问题显然更深。问题(直接)不是Show
或ShowDialog
。他们不会抛出ArgumentNullException
。它必须由某个方法或构造函数抛出,该方法或构造函数在初始化后在MainForm
自身内执行。获取完整的stracktrace,并发布MainForm
自身的代码。。