问题描述
假如两个实例都创建好了,一个是Form1类产生的,一个Form2类产生的,然后通过Form2产生的实例能够动态修改Form1的实例的内容么,比如把Form1实例上的textbox1.text改成""
解决方案
解决方案二:
你是希望Form2关闭时返回值,来改变Form1控件的值么
解决方案三:
controls.find("textbox1",false)[0].text=""
解决方案四:
查询“C#事件通知
解决方案五:
方法一:一个对象要直接修改另一个对象,那么在对象中必须要引用另一个对象的实例才行的。比如在对象里new另一个对象或是方法的参数调用实参为另一个对象的实例。这样就可以直接操作另一个对象了。方法二:定义一个操作接口。一个对象通过接口引用操作另一个对象。另一个对象的类要实现这个接口。************************前两个是控制,后面的更像是传数据,因为刚看了论坛上面的贴子总结了下************************方法三:一个对象定义一个事件,在事件中传出数据。另一个对象注册这个事件,在事件处理中接收这个数据。方法四:找一个全局的对象来传数据。可以是对象,也可以文件,也可以是数据库。作为数据的中转站。方法五:我的想法是把简单的问题复杂化,就是MVC的方式,把两个Form当成视图。另建一个控制器对象,一个模型对象。比如这里Form1里面提交一个字符串。这个视图的数据传到控制器类的一个方法,控制器里这个方法把字符串传到模型对象里(经过模型对象处理这个字符串最后得到最终需要的结果)。控制器再从模型对象里将处理后的数据发送Form2中,Form2渲染这个数据输出。方法五看起来复杂了,但是后期应该有优势的:视图可以专注数据接收和呈现。模型专注数据加工。控制器控制程序流程。更加有条理功能更新升级更好。因为刚学习MVC。所以多说了一些提外话。高手勿笑话。
解决方案六:
忽然想到第六种:windows的消息机制,一个对象sendmessage。一个对象接收处理消息(窗体本身就有消息处理机制)。这个是很强大的,不但可以本程序内使用,还可以向所有windows窗体发消息以控制其它窗体。
解决方案七:
按楼主的要求控制,推荐使用接口方式:接口方式的优点是可以控制所有实现了这种接口的类。这样代码的通用性更高。比如定义一个接口实现打开的功能,电视和冰箱都实现了这个接口,那么操作接口就可以打开电视或打开冰箱了。如果不是控制只是传数据:推荐事件方式,两个类之间的耦合度底,可以在两个类的外部将一个类的事件,和一个类的方法关联起来就好,很清爽。(如果一个类是专门处理另一个类的,可以在这个类的内部注册另一个类的事件处理处理方法)
解决方案八:
给Form2里定义一个事件,也就用到了委托publicpartialclassForm2:Form{publicForm2(){InitializeComponent();}publicdelegatevoiddeleageClick(stringstr);publiceventdeleageClick_click;privatevoidbutton1_Click(objectsender,EventArgse){if(_click!=null){_click("hello");}}}下面是From1里面的,点击Form1的button弹出Form2,再点击Form2的button将"hello"传给了Form1的textBoxprivatevoidbutton1_Click(objectsender,EventArgse){Form2f2=newForm2();f2._click+=str=>{textBox1.Text=str;};f2.Show();}
解决方案九:
引用4楼Happy_BC的回复:
方法一:一个对象要直接修改另一个对象,那么在对象中必须要引用另一个对象的实例才行的。比如在对象里new另一个对象或是方法的参数调用实参为另一个对象的实例。这样就可以直接操作另一个对象了。方法二:定义一个操作接口。一个对象通过接口引用操作另一个对象。另一个对象的类要实现这个接口。************************前两个是控制,后面的更像是传数据,因为刚看了论坛上面的贴子总结了下************************方法三:一个对象定义一个事件,在事件中传出数据。另一个对象注册这个事件,在事件处理中接收这个数据。方法四:找一个全局的对象来传数据。可以是对象,也可以文件,也可以是数据库。作为数据的中转站。方法五:我的想法是把简单的问题复杂化,就是MVC的方式,把两个Form当成视图。另建一个控制器对象,一个模型对象。比如这里Form1里面提交一个字符串。这个视图的数据传到控制器类的一个方法,控制器里这个方法把字符串传到模型对象里(经过模型对象处理这个字符串最后得到最终需要的结果)。控制器再从模型对象里将处理后的数据发送Form2中,Form2渲染这个数据输出。方法五看起来复杂了,但是后期应该有优势的:视图可以专注数据接收和呈现。模型专注数据加工。控制器控制程序流程。更加有条理功能更新升级更好。因为刚学习MVC。所以多说了一些提外话。高手勿笑话。
请问第一种方法具体该怎么实行呢
解决方案十:
引用7楼u013402605的回复:
给Form2里定义一个事件,也就用到了委托publicpartialclassForm2:Form{publicForm2(){InitializeComponent();}publicdelegatevoiddeleageClick(stringstr);publiceventdeleageClick_click;privatevoidbutton1_Click(objectsender,EventArgse){if(_click!=null){_click("hello");}}}下面是From1里面的,点击Form1的button弹出Form2,再点击Form2的button将"hello"传给了Form1的textBoxprivatevoidbutton1_Click(objectsender,EventArgse){Form2f2=newForm2();f2._click+=str=>{textBox1.Text=str;};f2.Show();}
谢谢,学习了
解决方案十一:
如果只是传数据不推荐第一种,可以用上面u013402605给出的事件方法。如果是要控制另一个窗体可以用第2种接口更好,不过你要第一种,还是给您一个代码吧://窗体一代码记得加个文本框,并设置为publicpublicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){Form2f2=newForm2(this);//new一个窗体2出来,把窗体1的引用传给窗体2f2.Show();//窗体1把窗体2显示出来}}//窗体2代码,记得加个按钮publicpartialclassForm2:Form{Form1f1;//定义一个引用用来指向窗体1publicForm2(Form1f1)//参数为窗体引用{InitializeComponent();this.f1=f1;}privatevoidbutton1_Click(objectsender,EventArgse){f1.textBox1.Text="我是窗体2传过来的文字";}}