在windows.forms之间传递信息的最佳实践
如何在表单之间传递信息?转发是直接(对不起)使用属性或可能参数在新()或DoStuff()方法,但如何发送东西回当用户完成第二种形式? (IE的项目的ID中选择)我们已经使用所有这些:在windows.forms之间传递信息的最佳实践
- 传递主叫形式进入称为形式作为ref所以被叫形式可以在呼叫表上访问属性或方法。我真的不喜欢这个,因为这两种形式是非常相互依赖的。将呼叫形式作为对象传递只会稍微改善这一点。
- 使用事件这有点解耦代码,但签名必须匹配事件处理程序。
- 使用公共接口我正在谈论.NET中内置的一个,但我想你可以创建自己的。这对我来说似乎是最好的。
现在提高吧,如果窗体是在两个不同的DLL中呢?只要形式不相互依赖,我想这不会是一大步。
是否要访问第二个表单的UI元素?我认为更简洁的方法是使用共享对象将数据传回给调用表单。将对象作为参数传递给第二个表单构造函数,该构造函数可以填充实例字段并将该实例返回给调用窗体。如果需要,该对象还可以引发任何事件(如属性更改事件)以通知呼叫表单(或订户)。
如果是主窗体创建另一个窗体的实例,等待窗体做一些工作然后关闭并检查结果,那么拥有公共属性或监听事件是最有意义的。这些东西都不会受到不同集会中的表格的影响。您确实在两种表单之间获得了明确的绑定合约,但是如果在公共界面中描述了属性(如您所建议的那样),只要每个人都同意界面的条款,那么您就很好。
我不知道你希望得到多少更复杂。在过去,我使用一个静态单例对象来保存应用程序状态。应用程序状态对象会暴露程序的其他部分可以侦听的事件处理程序。主窗体将创建应用程序状态(只需获取它的引用)并听取其上的某些事件。然后,主窗体将创建子窗体和控件来完成工作。孩子们会改变应用程序状态对象的属性,这会反过来触发主要表单将会侦听的事件。这样,各种形式和控制就相互分离了。缺点是它们与应用程序状态单身人士紧密相连。
为表单创建公共属性,然后在处理新表单之前等待表单关闭并检查属性。
NewForm myForm = new NewForm();
myForm.ShowDialog();
string x = myform.MyProperty;
我成功做的一件事是在应用程序中创建一个轻量级的发布/订阅事件系统。这是在.net 1.1中,并不确定它如何随着泛型而改变。基本上我们有一个包含一个带有字符串键的散列表的单例,以及多播分配。
单例有RegisterForEvent(字符串键,委托处理程序),RaiseEvent(键,数据)等方法...
然后,我们定义了一个标准委托,并表示所有用户都必须实现此模式,例如我们的处理程序必须是:void方法(object sender,CustomEventArgs args)。发布者将定义他们自己的派生类CustomEventArgs。
好的是,这可以建立一个完整的解耦系统。我们有很多程序集,没有任何问题只需确保您的事件定义在其他潜艇可以在其中获得的地方。
我们有我们称之为不同的子系统,例如我们有一个监测互联网连接,当它引发一个事件,UI会改变,以表明他们的连接状态,我们也有一个排队服务,它会张贴消息到服务器,当它看到连接断开时,我们将停止发布。
它的缺点是它非常松散,至少我们的实施是耦合的,但有一些方法可以改进。
我发现,一旦你有一个精心设计的域实体对象模型或者干脆业务对象。这些任务变得更容易。
如果您没有域实体,例如Employee,Account,Location等,您会发现自己正在用一堆属性编写表单并创建大量笨拙的依赖关系。随着时间的推移,这可能非常混乱。
一旦你有了域实体,事情就容易处理了。例如,使用一个表格,您可以简单地创建一个Employee属性这样的编辑员工:
NewForm myForm = new NewForm();
myForm.Employee = employeeToEdit; // This can have state
myForm.ShowDialog();
Employee editedEmployee= myform.Employee;
EmployeeFacade.SaveEmployee(editedEmployee); // Or whatever
关于活动,为的Winform/WPF Apps功能它几乎跳投帮助的使用发布创建一个全局eventmanager进行/订阅模式处理表单之间的通信。这是非常罕见的,我将永远有一种形式直接与任何其他形式“谈话”。这是另一个话题,所以我不会详细讨论,如果你想要我可以提供的几个例子,我已经完成了。
Raiford Brookshire
this.Hide(); string [] name = new string []; new frmFormName = new frm(string what,string you,string going,string to,string put,stiring in); this.ShowDialog(); this.Show();