子窗体传值给父窗体

超级奶爸1231 2010-10-19 06:21:12
我用多个父窗体调用一个子窗体 子窗体返回一个datatable
然后父窗体使用子窗体返回的datatable来编辑

请问如何实现
...全文
537 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
最后一只恐龙 2010-10-20
  • 打赏
  • 举报
回复
用事件机制:
(1)定义一个用于传递参数的类,必须从EventArgs派生,需要传递的参数做成该类的成员

public class MyEventArgs : EventArgs
{
public DataTable dtData;
public MyEventArgs(DataTable dt)
{
dtData = dt;
}
}

(2)在子窗体中定义事件

public event EventHandler<MyEventArgs> DataSended;

(3)在子窗体生成数据后向外传递

if (DataSended!= null)
DataSended(this, new MyEventArgs(子窗体中的DataTable对象));

(4)父窗体的Load中增加事件响应,下面的函数名可以自己起

子窗体.DataSended += new EventHandler<MyEventArgs>(函数名);

(5)父窗体的响应函数

private void 函数名(object sender, MyEventArgs e)
{
// e.dtData就是子窗体中的DataTable
// 如果只是DataTable的处理,写代码就行了
// 如果还要做界面控件的访问,则需要使用代理。
}
xiaojinlai 2010-10-20
  • 打赏
  • 举报
回复
用委托完全可以
在主窗体(frmMain)定义委托变量,如public delegate void DataView(Datatable dt);
在主窗体定义一个实现委托的函数,如private void InitData(Datatable dt)

在子窗体(frmCchildForm)中定义 public DataView dataview;
在子窗体所需要事件中写如下代码即可
//以下的dt是子窗体中定义的Datatable dt
dataview(dt);

然后在主窗体所需要事件中写如下代码
frmCchildForm frm=new frmCchildForm();
frm.dataview+=new DataView(InitData);即可

swalp 2010-10-20
  • 打赏
  • 举报
回复
感觉你设计的有问题,现实生活中,哪有一个儿子好几个爸爸的啊。
杨友山 2010-10-20
  • 打赏
  • 举报
回复
用管道,写client和service
Delta 2010-10-20
  • 打赏
  • 举报
回复
属性,方法。都可以。。
luozhongxian001 2010-10-20
  • 打赏
  • 举报
回复
老大摆脱你说清楚点。一个程序只有一个主窗体(父窗体),通过事件来调用子窗体。
第一步;新建窗体类;NewForm
第二步;在主窗体中添加事件按钮;
第三步:在事件中newForm.show();点击事件窗口就可以调用子窗口了;
deadhero 2010-10-19
  • 打赏
  • 举报
回复
定义一个事件,父窗体订阅子窗体的事件,子窗体在关闭前触发事件,把传递的参数回传到父窗体
public class datatableevent:event
{
//定义DataTable的变量
}

public event EventHandler<datatableevent> 子窗体事件;



onformcloseevent(object e,eventarg e)
{
if(子窗体事件!=null)
{
子窗体事件(null,datatableevent对象);
}
}

子窗体事件定义好,剩下的就在父窗体上调用了
qxbtd 2010-10-19
  • 打赏
  • 举报
回复
能定义成子窗体的属性吗?
奋斗吧 2010-10-19
  • 打赏
  • 举报
回复
代码有点乱,,有种做法就是,把显示值的那个控件传过去给子窗口,子窗口定义个同类型的控件,并把父窗口传过来的控件赋给子窗口定义的控件,然后只要操作子窗口的这个控件就可以改变父窗口传过来那个控件的内容了,这是通过引用类型传值
bluedodo 2010-10-19
  • 打赏
  • 举报
回复
要吃饭了,初看了一下,如果是操作数据,试下委托
maole413149 2010-10-19
  • 打赏
  • 举报
回复
不允许在子窗体中出现父窗体么?如果不出现,且需要传递对象。消息肯定不行了,如果没一个中间位置,值怎么传递啊。
超级奶爸1231 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 maole413149 的回复:]
引用 14 楼 shd7228191 的回复:
引用 13 楼 lorenliu 的回复:
父窗体不能保留一个datatable的成员变量吗?当子窗口返回datatable时给这个成员变量赋值


如何返回? 返回后还要将值绑定到其他控件上 这些动作怎么实现?

你在父窗体写个静态方法,参数用来给datatable赋值,方法体用来绑定数据,这应该没问题吧
[/Quote]


你这样的话 要在子窗体里定义父窗体了 违背初衷了
超级奶爸1231 2010-10-19
  • 打赏
  • 举报
回复

 objdgv = new DataGridView();
DataTable objDataSet = new DataTable();
mpu_15booktree objForm = new mpu_15booktree("m_material_group", "<%1>Y",this.Name);
objForm.Show();
//这是返回datatable后要执行的动作
objDataSet = (DataTable)objdgv.DataSource;
string str_style=null;
for(int i = 0;i<objDataSet.Rows.Count;i++)
{
str_style+=objDataSet.Rows[i]["field"].ToString()+"',";
}
txt_workstation_style.Text=str_style.Substring(0,str_style.Length-2);




子窗体

public static DataTable g_dt_booktree;//这个是要操作的datatable
DataGridViewSelectedRowCollection rowColl = grd_booktree.SelectedRows;
if (rowColl == null)
{
return;
}
DataTable totalDT = (DataTable)grd_booktree.DataSource;
if (totalDT == null)
{
return;
}
g_dt_booktree = totalDT.Clone();
for (int i = 0; i < rowColl.Count; i++)
{
DataRow dataRow = (rowColl[i].DataBoundItem as DataRowView).Row;
g_dt_booktree.ImportRow(dataRow);
}

//操作完后我如何把值返回给父窗体 并执行父窗体的代码呢?
maole413149 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shd7228191 的回复:]
引用 13 楼 lorenliu 的回复:
父窗体不能保留一个datatable的成员变量吗?当子窗口返回datatable时给这个成员变量赋值


如何返回? 返回后还要将值绑定到其他控件上 这些动作怎么实现?
[/Quote]
你在父窗体写个静态方法,参数用来给datatable赋值,方法体用来绑定数据,这应该没问题吧
maole413149 2010-10-19
  • 打赏
  • 举报
回复
运行子窗体的时候传给父窗体标识,一一对应呗
可能我把需求误解了,方便的话,贴点代码或是觉个列子看看
超级奶爸1231 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lorenliu 的回复:]
父窗体不能保留一个datatable的成员变量吗?当子窗口返回datatable时给这个成员变量赋值
[/Quote]

如何返回? 返回后还要将值绑定到其他控件上 这些动作怎么实现?
LorenLiu 2010-10-19
  • 打赏
  • 举报
回复
父窗体不能保留一个datatable的成员变量吗?当子窗口返回datatable时给这个成员变量赋值
超级奶爸1231 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 maole413149 的回复:]
[/Quote]


那我如何在子窗体来运行父窗体的方法啊? 是多个父窗体
maole413149 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shd7228191 的回复:]
反射的话 控件还可以 我的想法是父窗体定义一个方法 让子窗体来调用 所有父窗体的方法的名字都一样
[/Quote]
那给父窗体给个静态方法,来执行
超级奶爸1231 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyq11 的回复:]
子窗体
public DataTable dt
{get;set;}
父窗体
获取dt属性
[/Quote]


我的子窗体是需要操作的
加载更多回复(9)

110,566

社区成员

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

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

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