这些问题.应该很多人都会做.但我这两天在百度里找了很久.仍然没有答案..
.所以还得再请教一下大家.1.父窗体怎么调用子窗体中的事件:
我的winform程式采用mdi方式..
比如在父窗体(frmMain)处,有一个[新增学生]的按钮.点击后.弹出学生窗体(frmStudent),其中有一个列表(datagridview)用来显示学生的信息
在frmStudent中.也有add,modify,delete等按钮.
父窗体上.也有add,modify,delete按钮.我想.比如学生窗体为当前的活动窗体时.
点击父窗体上的add,modify按钮.会调用frmStudent中的.add,delete等事件.
也就是说.在父窗体上.也同样可以捞得到学生窗体中的列表数据.这样才可以新增修改嘛.2.子窗体如何修改父窗体中的控件值. 比如我弹出学生窗体.学生列表中有50名学生的数据.我希望能在父窗体frmMain的状态栏(statusstrip)中显示条数.
如果是其它的窗体.则显示其它窗体的条数. 我知道有这么一个方法.
TextBox txtNum= (TextBox)Application.OpenForms["MainForm"].Controls["textBox1"];
这样子可以设置.但是.无法对statusstrip中的label设值. 初写winform,感觉有点陌生...盼各位大侠回复指教..分不多..就这一些...
.所以还得再请教一下大家.1.父窗体怎么调用子窗体中的事件:
我的winform程式采用mdi方式..
比如在父窗体(frmMain)处,有一个[新增学生]的按钮.点击后.弹出学生窗体(frmStudent),其中有一个列表(datagridview)用来显示学生的信息
在frmStudent中.也有add,modify,delete等按钮.
父窗体上.也有add,modify,delete按钮.我想.比如学生窗体为当前的活动窗体时.
点击父窗体上的add,modify按钮.会调用frmStudent中的.add,delete等事件.
也就是说.在父窗体上.也同样可以捞得到学生窗体中的列表数据.这样才可以新增修改嘛.2.子窗体如何修改父窗体中的控件值. 比如我弹出学生窗体.学生列表中有50名学生的数据.我希望能在父窗体frmMain的状态栏(statusstrip)中显示条数.
如果是其它的窗体.则显示其它窗体的条数. 我知道有这么一个方法.
TextBox txtNum= (TextBox)Application.OpenForms["MainForm"].Controls["textBox1"];
这样子可以设置.但是.无法对statusstrip中的label设值. 初写winform,感觉有点陌生...盼各位大侠回复指教..分不多..就这一些...
解决方案 »
- 给无限循环加间隔,间隔可随机可固定
- C# 添加web引用,总是弹出“Discovery Credential for Proxy Server”
- 简单多数据库链接问题 ,还未解决 ,问题再问
- 用vs2005建立ftp网站的问题,大家帮我看看什么原因啊!!
- C# winform有没有像Webform的验证控件的东东啊?
- 高手们有一个难题,大家来看看
- 【0615】【MSDN】【C#游戏开发项目实战】【全】【F】. 好东西快来下
- 传参问题,急!帮忙搞定了再别开贴给分!
- datagridview导出到excel,调用空间
- 哪位愿意帮忙把这6行java代码转为C#代码?
- C#嵌入WORD后?
- 问个三层里面数据库层 java和c#的写法区别?
比如在frmMain中打开 sutdent。
FrmStudent frmStudent=new FrmStudent();
frmStudent.Add(...);
frmStudent.Edit(..);
这应用于一般的情况。
反过来如果要子窗口修改父窗口里的内容,可以这样:
FrmStudent frmStudent=new FrmStudent();
frmStudent.Tag = this;
在子窗口的相应处理程序中:
frmStudent.Add(...)
{
((FrmMain)Tag).Add(..); //这个Add调用的是父窗口中的Add.
}这只是一个大概的,初级的方法,如果涉及到复杂的流程,需要修改整体系统的架构,使用比如委托、消息。
http://topic.csdn.net/t/20020725/17/901996.html
http://bbs.cfan.com.cn/thread-771079-1-1.html
推荐下这个,手把手型。
http://www.cnblogs.com/TZ-1983/articles/235188.html
在父窗口中不再有相关的代码,即使有按钮,实际也应该通过调用子窗口的方法来执行!
2:在父窗口中设置一个大体类似于UpdateData这样的公共方法,用于更新在父窗口中显示的有关子窗口的数据。
比如:你在父窗口中显示了Student窗口的记录条数,当执行了ADD或者DELETE的时候要更新这个数据,那么在UpdateData中执行。3:当子窗口或者其它任何有可能导致数据变化的方法执行完成后(在上面提到的子窗口的add,edit,delete方法的最后),调用UpdateData来刷新父窗口显示。4:调用updateData时,可以直接访问对象,也可以使用委托甚至事件来完成。当然,这比较考验你的把握能力了。
我先回复下phy的提示:1:将你的这些方法设置为public,这样你就可以直接通过对象方法。
我都将方法设为public,且在父窗体中都能够访问到.
但这个访问.都是实例化访问..
FrmStudent frmStudent=new FrmStudent();
frmStudent.Add(); 这样子后.我在frmStudent中的那些控件值.都变成null值.运行起来会报错...2,frmStudent.Add(...)
{
((FrmMain)Tag).Add(..); //这个Add调用的是父窗口中的Add.
} 我这边也能执行到这边.比如给父窗口中的控件设值..通过断点查看.都有执行到这里.
可是在页面上就是不显示出来..再次谢谢..phy的链接提示.现在下班..我明天再来研究...
因为这些值全部都变成'object 未定义'子窗体可以对父窗体中的值进行设置.比如定义一个属性.来get,set,
但它就是不显示在页面上.初写winform,问题再怎么简单.都让我冒汗...BS自己下...
第一个.把那个我要修改的控件中的modifiers属性设为public第二个.就是通过构造函数.把mainform传来传去...感觉有点烦索..不过好像winform就是这么个写法..
MainForm frmMain;
public Report(MainForm frm)
{
InitializeComponent();
frmMain = frm;
}//修改值
frmMain.txtNum="xxx";第一个问题..昨晚弄了.还是没有结果...继续弄吧...
看来头脑清醒.是多么的重要啊..希望大家不要常加班.弄的走路都晕.方法如下:
1.还是得把student中的datagridview的modifiers属性设为public
2.private void cmuModify_Click(object sender, EventArgs e) //父窗体中的修改事件
{
Student frmStudent=null;
for (int i = 0; i < this.MdiChildren.Length; i++)
{
frmStudent= this.MdiChildren[i] as Student;
}
frmStudent.cmuModify_Click(this, null); //执行子窗体中的事件. 此事件也要设成public类型
}我之前的错误.就是每次执行时.都FrmStudent frmStudent=new FrmStudent();
这样构造初始后..实际上应该是另外一个窗体了.所以访问上面的事件,及控件.都又是另外一回事了.为null
谢谢phy的帮助...希望你能对我上面的解决方法.再给点评议..看是否正确...
1.(在子窗口中设置公共的Add,Edit,Delete方法。)
没错.子窗口中的我都把这些方法设置为public,这样在窗口时.就不管它.就直接调用这些方法就好..如果方法中的代码有变.也只要修改一处即可.2.(在父窗口中设置一个大体类似于UpdateData这样的公共方法,用于更新在父窗口中显示的有关子窗口的数据。 )
我没有设置这样的一方法.我是把其中要显示的栏位.设为public,然后再在子窗体中刷新..因为每个子窗体可能要显示的文字不一样.3(3:当子窗口或者其它任何有可能导致数据变化的方法执行完成后(在上面提到的子窗口的add,edit,delete方法的最后),调用UpdateData来刷新父窗口显示。 )
是这样子的.我不管他们执行什么动作.我只要看盯着datagridview.
private void dgvStudent_DataSourceChanged(object sender, EventArgs e)
{
frmMain.txtNum.Text = ShowItemNum();
}4.(调用updateData时,可以直接访问对象,也可以使用委托甚至事件来完成。)
委托+事件,绝对是个好方法...以前在写web时,就感觉到了.
不过初写winform,昨晚怎么调试.都没有实现出来...看来.还是没有透彻理解委托...只懂得一些基本应用...
<<winfrom中的MonthCalendar 是否有類似web中的DayRender事件>>
http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx
http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx
在父窗体的单击事件里这样写
public string sql="";
private void buttion_Click(object sender,EventArgs e)
{
sql=this.textbox.text.trim().tostring();
form fr=new form(this);//this 代表父窗体
fr.show
}
然后在子窗体中 想定义一个父窗体的对象 类型为private 具体代码如下:
private form rm;
然后重构子窗体的构造函数
public f2(form f1)
{
rm=f1;
}
这样还没弄好 如果你要取得父窗体中的某个控件值 或者某个数据 你需要把父窗体中的 变量或者对象给定义为public
然后在子窗体中 就可以访问了
string str=rm.sql;这样就可以了
如果需要刷新父窗体中的数据 你可以直接调用重新绑定数据就OK了