Show子窗体调用的方法private void ShowSubForm()
{
Form2 frm = new Form2();
frm.Show();
}方式一:
Thread _subFormThread = new Thread(new ThreadStart(ShowSubForm));然后在主窗体Load的时候调用_subFormThread.Start();方法,只看到窗体Form2一闪而过,出不来。方式二:
用异步MethodInvoker mi = new MethodInvoker(ShowSubForm);
mi.BeginInvoke(null,null);
照样也是一闪而过。方式三:
改成同步mi.Invoke();
Form2出来了,而且没有获得焦点。请问是为什么?

解决方案 »

  1.   

    将你的代码稍做修改:
    private void ShowSubForm()
    {
    Form2 frm = new Form2();
    frm.ShowDialog();
    }这样就OK了
      

  2.   

    to dyw31415926
    必须要用线程方式,因为我的原意是要在这个线程里做一些数据检测与校验,校验成功才让这个子窗体Show出来to dugupiaoyun(独孤飘云)
    原因同上,该子窗体不能ShowDialog
      

  3.   

    to Knight94(愚翁)定义为成员也是一闪而过....
      

  4.   

    可以不用form,有form的那个class,比如FormXXX xxx=new FormXXX();xxx.ShowDialog();
      

  5.   

    对了, 这问题有点像怎么写带参数的线程一样, Knight94(愚翁) 的blog有类似的东西, 就是建立一个类, 将你要传过去的东西当成成员,而当合适的时候,你就将这个成员(就是窗体)show出来即可,
      

  6.   

    to dyw31415926谢谢,偶去找找看先~ ParameterizedThreadStart这东东偶还不太熟悉用法 :(
      

  7.   

    那你参看这篇文章
    http://blog.csdn.net/knight94/archive/2006/05/27/757351.aspx
      

  8.   

    to Knight94(愚翁)看完了,也明白你的做法,貌似用ShowDialog()还真的可以,不过我在用vs2005,ShowDialog里传入一个this参数后,所有的窗体会Show不出来,查看任务管理器会看到当前的僵尸进程。
      

  9.   

    不过,像这种进度条窗体,我以前的做法是先ShowDialog一个窗体,然后在该窗体再启动线程做别的事
      

  10.   

    to 不过我在用vs2005,ShowDialog里传入一个this参数后,所有的窗体会Show不出来,查看任务管理器会看到当前的僵尸进程。如何写得
      

  11.   

    private void ShowSubForm()
            {
                frm = new Form2();
                frm.ShowDialog(this);
            }
      

  12.   

    private void ShowSubForm()
            {
                frm = new Form2();
                frm.ShowDialog(this);
            }
    this??不是你当前创建的这个Form类嘛?
      

  13.   

    btw. 与frm是否为成员变量应该无关,定义成局部的照样也可以,只要用ShowDialog阻止该线程即可,同时也可以看到,这个ShowDialog并不算是真正的Dialog,主窗体Form1照样还可以获取焦点.
      

  14.   

    to worms8888() 
    this在这里是最开始的主窗体,即由Application.Run指定的窗体对象
      

  15.   

    sample code as follows:
    //in main form-load event
    Show();
    Thread thdSub = new Thread( new ThreadStart( ThreadFun ) );
    thdSub.Start();private void ThreadFun()
    {
        MethodInvoker mi = new MethodInvoker( OpenSub );
        this.BeginInvoke( mi );
        //Other operation here
    }private void OpenSub()
    {
        yourChildForm myChild = new yourChildForm();
        myChild.ShowDialog( this );
    }
      

  16.   

    to Knight94(愚翁) 这样还是用ShowDialog来阻止线程吧