如何在表单之间传递信息?使用属性或New()或DoStuff()方法中的参数可以直接转发(抱歉),但是当用户完成后,发送 返回 的内容会怎么样?第二种形式? (IE。所选项目的ID)我们已经使用了所有这些:
现在提高标准,如果表单在两个不同的DLL中怎么办?只要表格不依赖于彼此,我认为这不会是一大步。
答案 0 :(得分:3)
为表单创建公共属性,然后在处理新表单之前等待表单关闭并检查属性。
NewForm myForm = new NewForm();
myForm.ShowDialog();
string x = myform.MyProperty;
答案 1 :(得分:3)
我发现,一旦您拥有精心设计的 域实体对象模型 或仅仅是业务对象。这些任务变得更加容易。
如果您没有域实体,例如员工,帐户,位置等,您会发现自己正在编写包含大量属性的表单并创建大量笨拙的依赖项。随着时间的推移,这可能非常混乱。
一旦你有域实体到位,事情就会更容易处理。例如,要使用表单编辑Employee,您只需创建一个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应用程序,使用发布/订阅模式创建全局EventManager以处理表单之间的通信几乎没有用。很少有我会直接与任何其他形式进行一次“谈话”。这是另一个话题,所以我不会详细说明,如果你想要的例子,我可以提供一些我已经完成的。
Raiford Brookshire
答案 2 :(得分:0)
您想要访问第二种表单的UI元素吗?我认为更简洁的方法是使用共享对象将数据传递回调用表单。将对象作为参数传递给第二个表单构造函数,该构造函数可以填充实例字段并将该实例返回给调用表单。此对象还可以引发任何事件(如属性更改事件),以在需要时通知调用表单(或订阅者)。
答案 3 :(得分:0)
如果是主窗体创建另一个窗体的实例,等待窗体做一些工作然后关闭,并检查它的结果,那么拥有公共属性或监听事件是最有意义的。将表单放在不同的程序集中,这些都不会受到影响。您确实在两个表单之间获得了明确的绑定契约,但是如果在公共接口中描述了属性(如您所建议的那样),那么只要每个人都同意接口的条款,您就会很好。
我不确定你想要得到多少复杂。在过去,我使用静态单例对象来保存应用程序状态。 app-state对象将公开程序的其他部分可以监听的事件处理程序。主窗体将创建app-state(只是真正获得它的引用)并听取它上面的某些事件。然后主窗体将创建子窗体和控件来完成工作。孩子们将改变app-state对象的属性,这反过来会触发主要表单将要监听的事件。通过这种方式,各种形式和控制彼此分离。缺点是他们与app-state单身人士紧密相连。
答案 4 :(得分:0)
我成功做的一件事是在应用程序中创建一个轻量级的发布/订阅事件系统。这是在.net 1.1中,并不确定它如何随着泛型而改变。基本上我们有一个单例,其中包含一个带有字符串键的哈希表和多播delgates。
单例有像RegisterForEvent(字符串键,委托处理程序),RaiseEvent(键,数据)等方法......
然后我们定义了一个标准委托,并说所有用户都必须实现这种模式,例如我们的处理程序必须是:void方法(对象发送者,CustomEventArgs args)。发布者将定义自己的CustomEventArgs派生类。
好消息是,这允许构建一个完全解耦的系统。我们有很多程序集,并且没有任何问题只需要确保你的eventargs被定义在其他潜艇可以得到它们的地方。
我们拥有所谓的不同子系统,例如我们有一个监控互联网连接,当它引发事件时,UI会改变以指示其连接的状态,我们还有一个排队服务,它会发送消息到服务器,当它看到连接断开时,我们将停止发布。
缺点是它至少与我们的实施非常松散,但有很多方法可以改进。
答案 5 :(得分:0)
this.Hide(); string [] name = new string []; 新表单FormName = new from(string what,string you,string going,string to,string put,stir in); this.ShowDialog(); this.Show();