很奇怪的问题,我调用了一个类。想从这个类运行中派生出一个form来,用show()却不行,也不报错。 但用showdialog()就可以出来。请教!

解决方案 »

  1.   

    你Show完方法就结束了,你还没看见Form对象它的生存期就结束了,随即被GC当做垃圾回收...而ShowDialog方法只到你关闭Form之前阻止调用方法结束...去看看对象生存期的知识...
      

  2.   

    学习楼上的,winform的话应该可以用Show方法吧
      

  3.   

    恩刚才研究了下,确实如此。请问先生那我在类中怎么能用show()产生一个独立的窗体呢?
      

  4.   

    winform里面好像就是可以的,但具体一个类里怎么就不行了?
      

  5.   

    在类中将Form对象声明为类级变量就可以在你的类生存周期内显示...
      

  6.   

    又研究了下,发现winform也是那样走的,当主线程走完才show出窗口来的。所以如果class的应该也是可以show()的。只是我做的是sockect侦听和显示,这个class类走完就去侦听了,应该是完结不了,所以显示不出来:(
    谁知道类怎么去触发一个事件么?
      

  7.   

    实例一个form,
    再进行show()
    试试看
      

  8.   

    我用的就是你说的啊,先 form a = new form();
          a.show();
      

  9.   

    嗯...这才是正路...在类中定义一个事件,在你原来Show Form的方法中触发,在UI Form中订阅事件,在事件中Show Form...具体去看看MSDN中的委托与事件...
      

  10.   

    我在winform试了可以
        class Class1
        {
            public Class1(Form form)
            {
                newForm1 f1 = new newForm1();
                f1.MdiParent = form;
                f1.Show();
            }
        }把生成的form作为Mdi的子窗口,不用mdi应该也可以。
      

  11.   


    恩我也发现了,我做的是侦听后触发,所以程序是死的循环,所以show不出来。我认识到这一点了,现在是找方法从这个死循环中能触发一个新的出来。谢谢你。不知道委托可不可以,初来乍到,请大家多多提点:)
      

  12.   

    你单步跟踪进去,看看是哪里导致退出的
    在函数中form a =new form();a.show(); 这个是绝对没有问题
    不一定非得定义成class的成员才能正常显示。
    好好调试检查下代码
      

  13.   

    “这个class类走完就去侦听了" 你的show是在你的侦听方法里吗?如果阻塞了,就看不到了。
      

  14.   

    谢谢你,我去查看下。因为刚学sockect不久对委托还不太会用,只知道他是个新线程,但最后还是要走到主线程里的咯??那还是走不完:(
      

  15.   

    委托可以
    实例化form的方法写到你的form1里能行,就是不知道合不合你的要求
    要不就多开个线程试试
      

  16.   

    我的侦听是学着msdn才用委托处理,这个类里面包含这个侦听的,当侦听到后走到委托线程,侦听应该是继续的。然后呢做处理,我是想在这个处理过程中show收来的信息。
      

  17.   

    可以在你的类中定义一个委托,在你的form1中绑定你 new form 的方法(new form 的方法是在你窗体代码中的),然后在你类的某个地方执行委托(或者触发一个基于该委托的事件)。
      

  18.   

    恩,非常感谢。我是通过学sockect学线程和委托的,所以菜的很。我去搞下看。
      

  19.   

    可以在你的回调方法(就是endreceive)里执行委托,试试,这个我没做过,我时吧说到的数据直接显示到原来的窗体上的。你这个估计在数据的传递上也会有问题的。
      

  20.   

     private void endReceiveCallBack(IAsyncResult iar)
            {
                try
                {
                    Socket mySocket = (Socket)iar.AsyncState;
                    try
                    {
                        int received_byte = mySocket.EndReceive(iar);
                        if (received_byte == 0)
                        {
                            mySocket.Close();
                            return;
                        }
                        data = Encoding.UTF8.GetString(dataReceived, 0, received_byte);                    this.OnGetData();//获得数据,这个事件通过委托在窗体上的方法获得你变量存的数据。
    //有需要的时候可能要自己定义事件的参数,这个就有点麻烦了。
                        this.endAcceptCallback();
                        gramCount++;
                    }
                    catch (Exception e)
                    {
                        mySocket.Close();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    ex.ToString();
                }
            }
      

  21.   

    public void ReceiveData(IAsyncResult iar)
            {
               
                Socket client = (Socket)iar.AsyncState;
                
                try
               {
                    int recv = client.EndReceive(iar);
                    if (recv > 0)
                    {
                        if (Encoding.Default.GetString(byteMessage) == "")
                        {
                            return;
                        }
                        string sTime = DateTime.Now.ToShortTimeString();                    string msg = sTime + ":" + "Message from:";
                        string msgg=Encoding.Default.GetString(byteMessage);
                        if (msgg=="finish1234")
                        {
                         string stringData = "finish";
                         byte[] message = Encoding.Default.GetBytes(stringData);
                         client.Send(message);
                         socket.BeginAccept(new AsyncCallback(AcceptConn), socket);
                         client.Shutdown(SocketShutdown.Both);
                         thread1 = new Thread(new ThreadStart(mshow));
                         thread1.Start();

                         return;
                        }
                        m = m+msgg;
                        msg += client.RemoteEndPoint.ToString() + Encoding.Default.GetString(byteMessage);
                        if (client.Connected)
                        {
                            client.BeginReceive(byteMessage, 0, byteMessage.Length, SocketFlags.None, new AsyncCallback(ReceiveData), client);
                        }                  
                    } 
    我的代码是这样的。m是个全局变量!
      

  22.   

    if (msgg=="finish1234") 
    是对收来的包判断,因为我的buff是10个字节。这是个字符流结束标志!
      

  23.   

    Form2 f = new Form2();
                f.Show();
    并不是这段代码所在的方法运行完了GC就把f给回收了,只要你不让f关闭,它就永远在那。
      

  24.   

    恩,这个我明白。我现在是show 不出来。:)谢谢
      

  25.   

    按理来说就会出现这种情况,能否贴出那个Form的代码来?
    检查这几个属性:
    Size;
    Location;
    WindowState
      

  26.   

    补充:
    还有就是别使用using(frm):
    Form1 frm = new Form1();
    using(frm)
    {
     frm.Show();//这个Form1会显示一下就被GC回收的.
    }
      

  27.   


    大家都理解错我的意思了,其实我的问题应该出在程序没跑完,show()是出不来的.我showdialog()是可以,所以楼上的应该是没错,主要是我这个是socket侦听,当异步程序线程走完了还会去侦听,程序并没完全走完,而show()似乎要到程序执行完才出来的.现在关键是想怎么触发一个新事件让show()在新事件中做. 
    谢谢大家!大家辛苦了!
      

  28.   


    大哥,你的一句话点醒梦中人啊.我发现我的侦听是一个线程,根本没关系,因为我已经用了异步的了.哎,原来自己代码里有画蛇添足的一句,我真是小白都是异步了,还跳回去干什么呢?笨死了.找到问题所在.非常感谢所有支持的人!撒分:)
             string msgg=Encoding.Default.GetString(byteMessage); 
                        if (msgg=="finish1234") 
                        { 
                        string stringData = "finish"; 
                        byte[] message = Encoding.Default.GetBytes(stringData); 
                        client.Send(message); 
                        socket.BeginAccept(new AsyncCallback(AcceptConn), socket); 
                        client.Shutdown(SocketShutdown.Both); 
                        thread1 = new Thread(new ThreadStart(mshow)); 
                        thread1.Start(); 
                        return; 
                        } 
      

  29.   

    不过死循环中怎么触发个事件来show()一个窗口还是要去研究下,不知道可否的.