它们都放在Main()方法里作为启动WinForm时,后面的语句一闪就过了,但将new frmMain().Show();放在一个窗体的Button单击事件里作为从一个窗体启动另一个窗体时,这个窗体并不会一闪就消失,请问这里为什么?
下面是摘选的相关代码:
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
//Application.Run(new frmMain());
frmMain _f=new frmMain();
_f.Show();
}
catch (ArgumentException ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
} private void button1_Click(object sender, EventArgs e)
{
if (_frm != null)
_frm.Dispose(); _frm = new frmADOXML();
_frm.Show();
}
下面是摘选的相关代码:
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
//Application.Run(new frmMain());
frmMain _f=new frmMain();
_f.Show();
}
catch (ArgumentException ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
} private void button1_Click(object sender, EventArgs e)
{
if (_frm != null)
_frm.Dispose(); _frm = new frmADOXML();
_frm.Show();
}
解决方案 »
- c#中去如何掉字符串多余空白?新手勿喷~~
- 关于c# 调用 c++ dll
- 求助vs Installer:错误代码 2869 安装问题解决方案
- 请问各位大侠 ,怎样设置datagrid 分页属性, 可以实现分页啊 ? 请帮帮忙指点一下 谢谢 !!!
- c#初学者请教问题
- 这多线程程序问题在哪
- 一问题请高手帮忙
- 【跨平台开发神器】用c#开发iOS、Android 与Windows 应用,你也可以!
- 在C#.net中有没有像vb.net中过程sub--end sub的功能?
- 请教有关C# DataSet DataTable DataGrad SqlCommand SqlDataAdapter 的区别
- 如果让网页的页眉页脚自动为空??急!!
- 利用Windows API的SendMessage和PostMessage控制窗体
除非调用close或application.exit方法,程序才中止。new frmMain().Show();
没有进入消息循环 Main()执行完毕
所以会一闪而过但将new frmMain().Show();放在一个窗体的Button单击事件里作为从一个窗体启动另一个窗体时,这个窗体并不会一闪就消失
那个有button的窗体在消息循环中 所以new frmMain()也受消息循环控制
与原来VB6的启动窗体的机制有什么不同?
VB里启动窗体都是,建立后,执行其窗体的show()方法及可,不论是主窗体还是由主窗体建立的其他窗体.就是说VB里没有将窗体"进入消息循环"这一说法?
要想让程序一直运行,那么Main函数就就要一直在运行,如果Main函数运行到了最后,程序就会退出,所以你的窗体只是闪了一下程序就跟着退出了.要想让一个窗体在Main函数里启动一定要用Application.Run来运行,或者把这个窗体显示为模式的:
new frmMain().ShowDialog();
我是问,
做VB6.0时,也可以用new FrmMain.Show()这样的方式来启动窗体,而且,除非点击关闭按钮,否则就是Main()方法中来启动Main()执行完也不会退出.
这和C#有什么本质上的区别造成的?
''' <summary>
''' 系统启动模块,做一些系统启动的准备和初始化工作;
''' </summary>
''' <res>
''' </res>
''' <history>
''' [fujun] 2007-1-15 Created
''' </history>
''' -----------------------------------------------------------------------------
Module InitializeModule Initialize
Public f_Login As New Login Public Sub Main()Sub Main()
'将登录界面作为启动的初始界面;
Application.Run(f_Login)
End Sub
End Module
这里使用了Application.Run(Form)的方法来启动登录界面(f_Login)。但是我最开始的代码不是这样写的,我开始的时候使用的是f_Login.Show()方法来启动。运行的结果是登录界面在屏幕中闪现了一下就消失了,系统也运行完毕。通过断点跟踪,发现Application.Run(Form)方法运行后,就弹出了登录界面(f_Login),以后似乎就和Application.Run(Form)这个函数好像没有关系了。然后如果你如果你完全退出了系统,Application.Run(Form)才执行完成,然后退出。反过来如果使用Form.Show()方法,那么执行Form.Show()完成后,马上就退出了Main()函数。从这里我们就可以知道为什么使用Form.Show()后,登录界面仅仅只会在屏幕中闪现一下就没有了。那是由于Main函数执行完成了,用于执行程序的线程也就销毁了,程序当然退出了。从MSDN中查看了一下Application.Run()函数的定义--"在当前线程上开始运行标准应用程序消息循环。",不是很懂,用Reflector查看了一下Application.Run()的实现代码,如下所示:Public Shared Sub Run()Sub Run()
ThreadContext.FromCurrent.RunMessageLoop(-1, New ApplicationContext)
End Sub
似乎是建立一个应用程序运行的上下文环境(ApplicationContext)。还有一点是在后续编程的过程中发现的,用Application.Run(Form)启动的这个窗体, 我这个项目中就是f_Login,是不能通过销毁(Dispose)的,如果销毁了那么引用程序也就随之退出了。比如这个项目还有一个主菜单界面,是在登录成功后显示的,如果登录成功后登录界面显然是不需要再显示出来了。那么代码如下: If (txtLoginName.Text.Trim() = String.Empty) Then
MsgBox(NOLOGINNAME)
ElseIf (txtPassword.Text.Trim() = String.Empty) Then
MsgBox(NOPASSWORD)
Else
Dim objFacade As New Facade.FacadeBase If (objFacade.CheckIsUser(txtLoginName.Text, txtPassword.Text) = True) Then
'如果登录成功,那么显示主界面;
Dim objMainMenu As New MainMenu
objMainMenu.Show()
Me.Hide()
'Me.Dispose() '如果这里销毁了登录界面对象(f_Login)的话,那么整个系统也会随之退出。
Else
MsgBox(NOSUCHUSER)
End If
End If
这里是将登录界面(f_Login)的Visible属性设置为False(通过了Hide()方法),也就是登录界面虽然看不见但是实际上是存在于内存中的,由于它的存在,那么系统就依然正常运行而不会退出。而如果用Dispose方法将其对象销毁掉后那么系统的线程也就退出了,而不能再继续运行。
感谢 vividboy http://blog.csdn.net/vividboy/archive/2007/01/15/1483974.aspx
Startup form:Form1
Startup object:Program