跪求大神一个关于两个窗口实现互相传值(类似于两个窗体聊天的问题)

Fowindy 2020-09-26 08:34:02
跪求大神一个问题,我想实现一个项目中的两个Form窗口之间的互相传值,类似于两个窗口聊天发信息,现在我用委托从子窗体想父窗体发消息没有问题,但是是通过按父窗体按钮触发实例化子窗体并向子窗体构造函数传参数实现的;所以现在的问题是父窗体向子窗体发消息,每次都会生成一个子窗体,我想只能生成一个子窗体怎么实现?


Form1窗体:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btn1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(txt1.Text,DoSth);

f2.Show();
}
//把字符串变量的值赋值给文本框
public void DoSth(string msg)
{
txt1.Text = msg;
}
}

Form2窗体:
public delegate void MyDel(string str);
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();//初始化窗体的
}
private MyDel _mdl;
public Form2(string str,MyDel mdl):this()
{
textBox1.Text = str;
this._mdl = mdl;
}

private void button1_Click(object sender, EventArgs e)
{
//调用委托的时候 一定要先判断
if (this._mdl!=null)
{
this._mdl(textBox1.Text);
this.Close();
}

}
}
...全文
22907 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
shawn_yang 2020-10-16
  • 打赏
  • 举报
回复
两个窗体都public 一个属性不就好了,彼此读写对方属性
狂野的小强 2020-10-14
  • 打赏
  • 举报
回复
事件事件事件
appo_li 2020-10-05
  • 打赏
  • 举报
回复
最简单的是使用tag,传啥都行
  • 打赏
  • 举报
回复
要注意的是,许多人仅仅习惯于“现在我用委托从子窗体想父窗体发消息没有问题”这类抄来的代码简单复制粘贴,所以这往往谈不上“程序设计”。真正的程序设计师不论是(内存)存储、UI、通讯、服务等等,都能独立和跨语言地先对任何系统的整个的数据(或者说“基于对象”)的层次结构有关基本的文档。
  • 打赏
  • 举报
回复
是的,frmChild 是窗体的一个属性,是属于(父)窗体对象的,而不是 btn1_Click 方法内部的一个局部对象。如果没有高清楚数据结构,编程就成了浪费资源,不断地推倒重来。
千杯不醉-sen 2020-09-30
  • 打赏
  • 举报
回复
单例模式!!!
SayoKun 2020-09-30
  • 打赏
  • 举报
回复
引用 3 楼 อาเหว่ย 的回复:
这个其实非常简单,不要这么麻烦。 F1主窗体,F2次级窗体,不用CHILD都可以。但不使用的时候HIDE或者CLOSE F2写一个PUBLIC方法。接收信息的,无论单值 还是多值。SHOW之前执行一下即可。
这位大兄弟已经说的比较明确了,我稍作补充……

//首先你需要在子窗体中创建一个或多个public如下
public string GetParm{get;set;}

//然后在你要调用子窗体的地方
//这里的new实际上应该放在mainwindow初始化或只执行一次的地方,剩下的就是3楼大兄弟说的Hide就行了。
F1 子窗体=new F1();
子窗体.GetParm = "你需要传的参数";
libolei 2020-09-30
  • 打赏
  • 举报
回复
父子窗体互传


//父窗体
FrmChild frmChild = null;
        private void button8_Click(object sender, EventArgs e)
        {
            if (frmChild == null)
            {
                frmChild = new FrmChild(this);
                frmChild.Show();
            }

            frmChild.ShowMess("11");
        }
        public void ShowMess(string mess)
        {
            this.textBox1.Text += mess + "\r\n";
        }


//子窗体
Form1 _frmParent = null;

        public FrmChild(Form1 frmParent)
        {
            InitializeComponent();

            _frmParent = frmParent;
        }

        private void FrmChild_Load(object sender, EventArgs e)
        {

        }

        public void ShowMess(string mess)
        {
            this.textBox1.Text += mess + "\r\n";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _frmParent.ShowMess("22");
        }


libolei 2020-09-30
  • 打赏
  • 举报
回复

//父窗体
        FrmChild frmChild = null;
        private void button8_Click(object sender, EventArgs e)
        {
            if (frmChild == null)
            {
                frmChild = new FrmChild();
                frmChild.Show();
            }

            frmChild.ShowMess("11");
        }

//子窗体
public void ShowMess(string mess)
        {
            this.textBox1.Text += mess + "\r\n";
        }

这样就行了 但是感觉业务场景有点怪
  • 打赏
  • 举报
回复
这个其实非常简单,不要这么麻烦。 F1主窗体,F2次级窗体,不用CHILD都可以。但不使用的时候HIDE或者CLOSE F2写一个PUBLIC方法。接收信息的,无论单值 还是多值。SHOW之前执行一下即可。
threenewbee 2020-09-26
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/360140208
八爻老骥 2020-09-26
  • 打赏
  • 举报
回复
子窗口做成单例啊,不要一点窗口就new一个,而是创建好了放在一边,不用了就hide,而不是close。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧