虚心求教:请问在两个窗体之间如何传递数据?又或如何传递消息?

bwangel 2007-03-25 06:17:54
比如form1里要打开对话框form2,form2要返回一个值,然后form1根据该值作某些操作.通常我的作法是:

1.在form1的某个里定义一个form2的变量,然后初始化并打开它.
2.form2打开以后根据用户的输入得到该值, 并马上调用form1中的一个公共方法执行某些操作.
3.form2自已close.

但是我觉得这种方法虽然简单,但是form1和form2耦合度太高,不利于form2用于其他用途.
一定有更好的方法, 请大家提点一下我,行吗?
...全文
314 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bwangel 2007-03-25
  • 打赏
  • 举报
回复
非常感谢楼上的楼上的回答, 也非常感谢楼上,虽然你的是Web端?
Xpengfee 2007-03-25
  • 打赏
  • 举报
回复
Form1 里用打开
var xx=window.showModalDialog(strURL, paraName,"dialogWidth:" + paraWidth + "px;dialogHeight:" + paraHeight + "px;status:no;scroll:no;center:yes")

Form2里在<head>里加上<base target="_self" />
然后window.parent.returnValue =“aaaaaaaaaa”;


这样Form1里的xx就能得到值"aaaaaaaaaaa";
pfworld 2007-03-25
  • 打赏
  • 举报
回复
C# 中的“事件”是当对象满足一定条件,发生某些事情时,类向该类的客户提供通知的一种方法。使用事件,拥有该事件的对象不必知道需要通知谁,一旦满足了某个条件,将自动调用该事件,正确通知每个需要通知的对象。通过使用事件,提高了程序的模块化程度。
  
  要在程序中使用自定义事件,需按以下步骤进行:
  
  1、声明事件
  
  要在类内声明事件,首先必须声明该事件的委托类型:
  public delegate void SelectionChangedEventHandler(object sender,
  SelectionChangedEventArgs e);
  
  说明:由于本示例程序需在事件中传递数据,因此定义了EventArgs的派生类SelectionChangedEventArgs。
  public class SelectionChangedEventArgs : EventArgs
  {
  private string m_selection;
  
  //本属性用于传递事件数据
  public string Selection
  {
  get { return m_selection; }
  }
  
  public SelectionChangedEventArgs(string selection)
  {
  m_selection = selection;
  }
  }
  
  委托类型定义传递给处理该事件的方法的一组参数。多个事件可共享相同的委托类型,因此仅当尚未声明任何合适的委托类型时才需要执行该步骤。
  
  接下来,声明事件本身:
  public event SelectionChangedEventHandler SelectionChanged;
  
  2、调用事件
  
  如果没有任何客户将委托与该事件挂钩,该字段将为空;否则该字段引用应在调用该事件时调用的委托。因此,调用事件时通常先检查是否为空,然后再调用事件。
  public class Form2 : System.Windows.Forms.Form
  {
  ... ...
  
  public event SelectionChangedEventHandler SelectionChanged;
  
  ... ...
  
  private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
  {
  if (SelectionChanged != null)
  {
  SelectionChangedEventArgs E = new SelectionChangedEventArgs(comboBox1.Text);
  SelectionChanged(this, E);
  }
  }
  }
  
  3、与事件挂钩
  
  为了开始接收事件调用,客户代码先创建事件类型的委托,该委托引用应从事件调用的方法。然后它使用 += 将该委托写到事件可能连接到的其他任何委托上。
  public class Form1 : System.Windows.Forms.Form
  {
  ... ...
  
  private Form2 m_frm2;
  
  ... ...
  
  public Form1()
  {
  ... ...
  
  m_frm2 = new Form2();
  
  //与事件挂钩
  m_frm2.SelectionChanged += new SelectionChangedEventHandler(frm2_SelectionChanged);
  }
  
  ... ...
  
  private void button1_Click(object sender, System.EventArgs e)
  {
  m_frm2.ShowDialog();
  }
  
  private void frm2_SelectionChanged(object sender, SelectionChangedEventArgs e)
  {
  //获取事件传递过来的数据
  textBox1.Text = e.Selection;
  }
  }
blue7justin 2007-03-25
  • 打赏
  • 举报
回复
使用委托

bwangel 2007-03-25
  • 打赏
  • 举报
回复
谢谢楼上的回答,可是我仍然有问题,
1.如果是非模式form2, 问题好办,因为点下完成按钮时,对象还在, 里面的东西form1知道.

2.如果是模式对话框, 点下完成,对话框关闭了, 即使form1得到了事件, 但是得不到form2里的数据了啊?
winer2006 2007-03-25
  • 打赏
  • 举报
回复
一般form1调用form2,不要在form2中加上调用form1的代码。
1.如果form2是以模式窗口出现(这种情况form2大我是为了执行查询,数据选择或状态判断等),可以在form2的构造函数中加一个返回值参数,在form1中声明一个变量,创建一个以这个变量为参数的form2实例并显示,等form2执行完把要返回的值,消息,结果之类的赋给这个变量,form2关闭。form1根据变量的值确定如果执行就可以了。

2.如果form2是以非模式窗口出现(这种情况少,大多是form2并不是专门为form1服务,只是执行结果影响了form1中的数据数据显示之类),可以在form2类中添加一个事件,在完成按钮中触发这个事件。在form1中加上事件过程,在事件过程中对form1进行刷新。

初学C#,这是以前用VB,VC时用的方法。C#中有没有新的方法还没研究到。
kissknife 2007-03-25
  • 打赏
  • 举报
回复
LZ可以看看C#里委托相关的内容..
bwangel 2007-03-25
  • 打赏
  • 举报
回复
我觉得这是一个很严重的问题, 如果C#没有好的解决方法,那也没有那么多人追捧了.
可不可以在form2中定义一个公共接口或委托之类的,具体怎么实现呢?
czjearth 2007-03-25
  • 打赏
  • 举报
回复
如果 Form2 只是 模态对话框 的话, 我以为这么做就可以了,

110,529

社区成员

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

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

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