实例化的类怎么show()出form窗口 很奇怪的问题,我调用了一个类。想从这个类运行中派生出一个form来,用show()却不行,也不报错。 但用showdialog()就可以出来。请教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你Show完方法就结束了,你还没看见Form对象它的生存期就结束了,随即被GC当做垃圾回收...而ShowDialog方法只到你关闭Form之前阻止调用方法结束...去看看对象生存期的知识... 学习楼上的,winform的话应该可以用Show方法吧 恩刚才研究了下,确实如此。请问先生那我在类中怎么能用show()产生一个独立的窗体呢? winform里面好像就是可以的,但具体一个类里怎么就不行了? 在类中将Form对象声明为类级变量就可以在你的类生存周期内显示... 又研究了下,发现winform也是那样走的,当主线程走完才show出窗口来的。所以如果class的应该也是可以show()的。只是我做的是sockect侦听和显示,这个class类走完就去侦听了,应该是完结不了,所以显示不出来:(谁知道类怎么去触发一个事件么? 实例一个form,再进行show()试试看 我用的就是你说的啊,先 form a = new form(); a.show(); 嗯...这才是正路...在类中定义一个事件,在你原来Show Form的方法中触发,在UI Form中订阅事件,在事件中Show Form...具体去看看MSDN中的委托与事件... 我在winform试了可以 class Class1 { public Class1(Form form) { newForm1 f1 = new newForm1(); f1.MdiParent = form; f1.Show(); } }把生成的form作为Mdi的子窗口,不用mdi应该也可以。 恩我也发现了,我做的是侦听后触发,所以程序是死的循环,所以show不出来。我认识到这一点了,现在是找方法从这个死循环中能触发一个新的出来。谢谢你。不知道委托可不可以,初来乍到,请大家多多提点:) 你单步跟踪进去,看看是哪里导致退出的在函数中form a =new form();a.show(); 这个是绝对没有问题不一定非得定义成class的成员才能正常显示。好好调试检查下代码 “这个class类走完就去侦听了" 你的show是在你的侦听方法里吗?如果阻塞了,就看不到了。 谢谢你,我去查看下。因为刚学sockect不久对委托还不太会用,只知道他是个新线程,但最后还是要走到主线程里的咯??那还是走不完:( 委托可以实例化form的方法写到你的form1里能行,就是不知道合不合你的要求要不就多开个线程试试 我的侦听是学着msdn才用委托处理,这个类里面包含这个侦听的,当侦听到后走到委托线程,侦听应该是继续的。然后呢做处理,我是想在这个处理过程中show收来的信息。 可以在你的类中定义一个委托,在你的form1中绑定你 new form 的方法(new form 的方法是在你窗体代码中的),然后在你类的某个地方执行委托(或者触发一个基于该委托的事件)。 恩,非常感谢。我是通过学sockect学线程和委托的,所以菜的很。我去搞下看。 可以在你的回调方法(就是endreceive)里执行委托,试试,这个我没做过,我时吧说到的数据直接显示到原来的窗体上的。你这个估计在数据的传递上也会有问题的。 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(); } } 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是个全局变量! if (msgg=="finish1234") 是对收来的包判断,因为我的buff是10个字节。这是个字符流结束标志! Form2 f = new Form2(); f.Show();并不是这段代码所在的方法运行完了GC就把f给回收了,只要你不让f关闭,它就永远在那。 恩,这个我明白。我现在是show 不出来。:)谢谢 按理来说就会出现这种情况,能否贴出那个Form的代码来?检查这几个属性:Size;Location;WindowState 补充:还有就是别使用using(frm):Form1 frm = new Form1();using(frm){ frm.Show();//这个Form1会显示一下就被GC回收的.} 大家都理解错我的意思了,其实我的问题应该出在程序没跑完,show()是出不来的.我showdialog()是可以,所以楼上的应该是没错,主要是我这个是socket侦听,当异步程序线程走完了还会去侦听,程序并没完全走完,而show()似乎要到程序执行完才出来的.现在关键是想怎么触发一个新事件让show()在新事件中做. 谢谢大家!大家辛苦了! 大哥,你的一句话点醒梦中人啊.我发现我的侦听是一个线程,根本没关系,因为我已经用了异步的了.哎,原来自己代码里有画蛇添足的一句,我真是小白都是异步了,还跳回去干什么呢?笨死了.找到问题所在.非常感谢所有支持的人!撒分:) 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; } 不过死循环中怎么触发个事件来show()一个窗口还是要去研究下,不知道可否的. c# 读取简单json的方法,急!!!!在线等 用正则表达式提取字符串 textbox输完数字后如何加函数. 用WebBrowser+Google API开发车辆调度系统,车辆多了拖动地图特别迟钝 如何判断我变量类型是int类型,急急急啊! 想往ERP方面发展,请问学哪门语言好些?? 如何从后台中得到前台中js代码的返回值? 怎样在C#中实现两个sql表之间的INSERT INTO ? 请问自已做出来的控件如何加个好看的图标呀,那个齿轮实在是太难看拉....... 请教一个C#问题??? 问一个下载相关的问题。 C# winform中怎样把TextBox中值显示在DataGrid中指定的一列
谁知道类怎么去触发一个事件么?
再进行show()
试试看
a.show();
class Class1
{
public Class1(Form form)
{
newForm1 f1 = new newForm1();
f1.MdiParent = form;
f1.Show();
}
}把生成的form作为Mdi的子窗口,不用mdi应该也可以。
恩我也发现了,我做的是侦听后触发,所以程序是死的循环,所以show不出来。我认识到这一点了,现在是找方法从这个死循环中能触发一个新的出来。谢谢你。不知道委托可不可以,初来乍到,请大家多多提点:)
在函数中form a =new form();a.show(); 这个是绝对没有问题
不一定非得定义成class的成员才能正常显示。
好好调试检查下代码
实例化form的方法写到你的form1里能行,就是不知道合不合你的要求
要不就多开个线程试试
{
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();
}
}
{
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是个全局变量!
是对收来的包判断,因为我的buff是10个字节。这是个字符流结束标志!
f.Show();
并不是这段代码所在的方法运行完了GC就把f给回收了,只要你不让f关闭,它就永远在那。
检查这几个属性:
Size;
Location;
WindowState
还有就是别使用using(frm):
Form1 frm = new Form1();
using(frm)
{
frm.Show();//这个Form1会显示一下就被GC回收的.
}
大家都理解错我的意思了,其实我的问题应该出在程序没跑完,show()是出不来的.我showdialog()是可以,所以楼上的应该是没错,主要是我这个是socket侦听,当异步程序线程走完了还会去侦听,程序并没完全走完,而show()似乎要到程序执行完才出来的.现在关键是想怎么触发一个新事件让show()在新事件中做.
谢谢大家!大家辛苦了!
大哥,你的一句话点醒梦中人啊.我发现我的侦听是一个线程,根本没关系,因为我已经用了异步的了.哎,原来自己代码里有画蛇添足的一句,我真是小白都是异步了,还跳回去干什么呢?笨死了.找到问题所在.非常感谢所有支持的人!撒分:)
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;
}