永发信息网

C# 跨窗口不能访问的问题

答案:3  悬赏:0  手机版
解决时间 2021-12-24 09:11
  • 提问者网友:回忆在搜索
  • 2021-12-23 10:32
首先我先说说一下我要做的事情,我正在练习写一个聊天软件,从创建套接字到连接都没问题,可到了信息传送的时候问题出来了:因为我的子窗口是用来创建套接字到连接,而信息发送与显示是从主窗口的文本框获取的,所以在跨窗口传文本时出了问题。
具体问题如下:
子窗口实例化主窗口对象: Form1 cs=new Form();然后通过cs访问richTextBox1,可我跟踪发现在主窗口中richTextBox1=“”,应该是实例化出的问题,可我找了很多资料也还是没解决,同样的道理在 子窗口改变richTextBox1的值回到主窗口,richTextBox1还是没有变。
我用过的办法如下:
在主窗口定义一个全局变量存放richTextBox1的值,这样的话子窗口是可以获取其文本了,但是却不能改变主窗口中的richTextBox1的值。
最后说明子窗口负责发送与读取数据。主窗口负责提供数据源与显示接收到的数据。
这是第一次用c#写程序,所以想多学点知识,故希望解决方法还是基于跨窗口传送文本的实现。谢谢!!

谢谢1楼,这种方法我用过了,这样能实现发送,不过只是从客户端发放服务端,反过来却不行!我进行跟踪发现form1.pCurrentWin.richTextBox1的值确实是改变了,但在主窗口却不是显示改变的那个值,而是原来的,但奇怪的是如果我发完客户端,发送的却又是form1.pCurrentWin.richTextBox1的值,而不是服务端文本框里面的值
还有一种情况:我的子窗口用了多线程,如果在线程函数下改下改变form1.pCurrentWin.richTextBox1的值,就会发生上面的情况,但只要不在线程函数就可以改变其值,并且主窗口的文本值也可以显示了,为了处理阻塞我必须用多线程。
这又该如何解决??谢谢!
最佳答案
  • 五星知识达人网友:雾月
  • 2021-12-23 11:55
1楼的方法是正确的;首先主窗口定义静态成员用来保存主窗口的对象,然后才能调用主窗口中你改变过的值,像你的 Form1 cs=new Form();是初始化一个主窗口的对象,所以你在主窗口改变的值在子窗口调用是不能完成的,反方向也是不能实现的。而静态成员对象却不一样,通过它调用是实时的所以能实现值的改变。
对于你的补充问题,我想可能是你在子窗口还有一些实例化主窗口的对象,因而产生个未知的异常(如:Form1 cs=new Form(),你用过的但没有删除),所以你把之前在子窗口中所有的主窗口实例对象全删除试试看
全部回答
  • 1楼网友:刀戟声无边
  • 2021-12-23 14:47
richTextBox1的属性改为public 在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: public static form1 pCurrentWin = null;   然后在主窗体构造函数中,给静态成员初始化,如下: pCurrentWin = this;   那么在子窗体中调用父窗体的richTextBox1,可以通过“form1.pCurrentWin.richTextBox1”来操作当前的主窗体的richTextBox1。 同理主窗体也这样操作子窗体的控件! 你这样试试!
  • 2楼网友:妄饮晩冬酒
  • 2021-12-23 13:30
你要理解,你这里的 数据不可能直接读的到的,除非把textbox1做成全局静态,但是这没必要。 你换一下思路,先把textbox1存在一个全局变量里面,再在form2中访问这个变量就好了。 如果是在form1上打开form2窗口,可以使用tag属性,它是object类型,实例名加一个点就可以找到它。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯