子控件中怎么调用父窗体的方法啊?

限量的蓝天 2014-07-18 04:11:03
父窗体form1中有
public void save()
{
....
}

自定义子控件 myPanel 中有
public void GoToNext()
{

}
现在我想在GoToNext中调用父窗体的save()方法,该怎么写代码啊?
...全文
618 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
限量的蓝天 2014-08-08
  • 打赏
  • 举报
回复
谢谢大家,最后用的委托写的。
phommy 2014-07-25
  • 打赏
  • 举报
回复
简单的: (myPanel.FindForm() as form1).save(); 复杂点的: myPanel的构造函数加个参数,把父窗体的save方法传进去 再复杂点: myPanel里加个事件,OnGoToNext,在父窗体捕获
mnxm 2014-07-25
  • 打赏
  • 举报
回复
引用 19 楼 fangwei198712 的回复:
[quote=引用 18 楼 wzn721721 的回复:] [quote=引用 17 楼 fangwei198712 的回复:] [quote=引用 16 楼 wzn721721 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:]

form1 frm = new form1();
frm.save()
大侠 你这样会使新手误入歧途的~~[/quote]为啥[/quote] 它不是调用原父窗体的方法,它是新建了一个父窗体并且调用其中的方法(我相信很少有人需要这样的功能的),数不清的新手写出这样的代码闷着头调试,找自己到底哪里错了.....[/quote]没注意new,一般不要new,直接把父窗口传到子窗口这是可以的吧[/quote] 嗯 传递对象 传递方法签名都可以
smthgdin_020 2014-07-25
  • 打赏
  • 举报
回复
用委托。。。。。
romanchaos 2014-07-25
  • 打赏
  • 举报
回复
分层,父窗体那个方法写到bll层,然后父子窗体都调用这个方法。从设计来说子窗体应该只知道父窗体传入的参数,但不能知道父窗体的行为。
偶是菜鸟 2014-07-25
  • 打赏
  • 举报
回复
引用 18 楼 wzn721721 的回复:
[quote=引用 17 楼 fangwei198712 的回复:] [quote=引用 16 楼 wzn721721 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:]

form1 frm = new form1();
frm.save()
大侠 你这样会使新手误入歧途的~~[/quote]为啥[/quote] 它不是调用原父窗体的方法,它是新建了一个父窗体并且调用其中的方法(我相信很少有人需要这样的功能的),数不清的新手写出这样的代码闷着头调试,找自己到底哪里错了.....[/quote]没注意new,一般不要new,直接把父窗口传到子窗口这是可以的吧
mnxm 2014-07-25
  • 打赏
  • 举报
回复
引用 17 楼 fangwei198712 的回复:
[quote=引用 16 楼 wzn721721 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:]

form1 frm = new form1();
frm.save()
大侠 你这样会使新手误入歧途的~~[/quote]为啥[/quote] 它不是调用原父窗体的方法,它是新建了一个父窗体并且调用其中的方法(我相信很少有人需要这样的功能的),数不清的新手写出这样的代码闷着头调试,找自己到底哪里错了.....
偶是菜鸟 2014-07-25
  • 打赏
  • 举报
回复
引用 16 楼 wzn721721 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:]

form1 frm = new form1();
frm.save()
大侠 你这样会使新手误入歧途的~~[/quote]为啥
whbq_2357124949 2014-07-24
  • 打赏
  • 举报
回复
通过子窗体刷新父窗体的方法 //增加子窗体 private void AddandDelete_Click(object sender,EventArgs e) { if(flag == false)//判断标识的值决定是否创建窗体 { CreateFrmChild();//创建子窗体 } for(int i = 0; i < this.dataGridView1.Controls.Count; i++)//循环遍历DataGridView控件上的控件集 { if(this.dataGridView1.Controls[i].Name.Equals(BabyWindow.Name))//当存在子窗体时 { flag = true;//改变标识Flag的值 break;//退出循环体 } } } #endregion private void ExitProject_Click(object sender,EventArgs e) { Application.Exit();//退出本程序 }//CodeGo.net/ #region 创建子窗体的CreateFrmChild方法 public void CreateFrmChild() { Frm_Child BabyWindow = new Frm_Child();//实例化一个子窗体 BabyWindow.MdiParent = this;//设置子窗体的父窗体为当前窗体 this.dataGridView1.Controls.Add(BabyWindow);//在DataGridView控件中添加子窗体 BabyWindow.UpdateDataGridView += new EventHandler(BabyWindow_UpdateDataGridView); BabyWindow.Show();//显示子窗体 } //刷新父窗体显示信息 void BabyWindow_UpdateDataGridView(object sender,EventArgs e) { if(Frm_Child.GlobalFlag == false) //当单击删除按钮时 { if(ConnPubs.State == ConnectionState.Closed) //当数据库处于断开状态时 { ConnPubs.Open(); //打开数据库的连接 } string AfreshString = "delete tb_User where userID=" + Frm_Child.DeleteID.Trim();//定义一个删除数据的字符串 PersonalInformation = new SqlCommand(AfreshString,ConnPubs); //执行删除数据库字段 PersonalInformation.ExecuteNonQuery(); //执行SQL语句并返回受影响的行数 ConnPubs.Close(); //关闭数据库 DisplayData(); //显示数据库更新后的内容 MessageBox.Show("数据删除成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);//弹出删除数据成功的提示 } else { if(ConnPubs.State == ConnectionState.Closed) //当数据库处于关闭状态时 { ConnPubs.Open(); //打开数据库 } string InsertString = "insert into tb_User values('" + Frm_Child.idContent + "','" + Frm_Child.nameContent + "','" + Frm_Child.phoneContent + "','" + Frm_Child.addressContent + "')";//定义一个插入数据的字符串变量 PersonalInformation = new SqlCommand(InsertString,ConnPubs);//执行插入数据库字段 PersonalInformation.ExecuteNonQuery();//执行SQL语句并返回受影响的行数 ConnPubs.Close(); //关闭数据库 DisplayData(); //显示更新后的数据 MessageBox.Show("数据添加成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);//弹出添加成功的提示信息 } }
mnxm 2014-07-24
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:

form1 frm = new form1();
frm.save()
大侠 你这样会使新手误入歧途的~~
yooxee 2014-07-24
  • 打赏
  • 举报
回复
使用事件,函数指针的委托 外层定义一个委托类型(函数指针类型) public delegate void NoParamDel(); 然后在自定义控件中申明一个NoParamDel的变量并使用它 public NoparamDel noparamdel = null; public void GoToNext() { if(noparamdel != null) { noparamdel(); } } 在窗体中创建自定义控件的时候,给控件的委托变量赋上一个委托实例即可 控件.noparamdel = new NoParamDel(Save); // = 或 +=都可,可以同时赋多个委托实例,串行执行
  • 打赏
  • 举报
回复
引用 楼主 u012439623 的回复:
现在我想在GoToNext中调用父窗体的save()方法,该怎么写代码啊?
想把设计理顺,从这种语言上面下功夫。在普通人也能看的懂的“大白话”上也能体现设计功夫。 描述业务逻辑时要遵循一定的设计模式规范,千万不要完全“原样照搬外行用户”的需求描述。
  • 打赏
  • 举报
回复
要是你说: 1. 在你的窗体中定义一个static的变量,然后任何TextBox控件都跑到你的窗体class里边去找什么变量去; 2. 在人家微软的TextBox控件里边定义一个引用你的窗体的属性,然后人家TextBox针对你的窗体编程; 仔细看,显然,这两种貌似简单的思路其实很“复杂”,都是让TextBox控件稍微重复使用一点就造成“死路”的思路。
  • 打赏
  • 举报
回复
如果有人告诉你设计的模式规范你会知道:子控件根本不应该知道父窗体。 比如说你使用了一个TextBox控件在窗体上,人家TextBox怎么调用你的窗体的呢?
於黾 2014-07-23
  • 打赏
  • 举报
回复
需求是需求,千万别拿来直接当方案实施 你最后实现同样的效果就行了,人家才不关心你到底怎么实现的
Mo_DeNo 2014-07-22
  • 打赏
  • 举报
回复
窗体之间相互调用,用委托就行,我之前也一直想怎么搞,哈哈。祝楼主好运。
限量的蓝天 2014-07-22
  • 打赏
  • 举报
回复
请问用委托,具体该怎么写啊?
  • 打赏
  • 举报
回复
如果你的控件继承自UserControl,那么会有一个ParentForm属性,引用的就是父窗体 this.ParentForm.Save()
exception92 2014-07-22
  • 打赏
  • 举报
回复
引用 6 楼 u012439623 的回复:
请问用委托,具体该怎么写啊?
http://blog.csdn.net/findsafety/article/details/21958091
youzelin 2014-07-18
  • 打赏
  • 举报
回复
(Parent as FrmParent).Save();
加载更多回复(4)

110,536

社区成员

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

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

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