[C#]不同窗体之间的传值
2015-05-30 22:45
387 查看
写了个父子页面的传值(交互),竟整出个死循环来,最后纠结地自己去填自己挖的坑(还好不是填别人的坑),废话不说,开始主题.
1. 问题的发生
根据父窗体中的输入值,在数据库中查询资料,并在子窗体加载的时候根据资料的不同显示不同的颜色,子页面中根据输入对数据库中的数据做一些修改,返回父窗体时,检查这些修改,并判断是否要修改父窗体中这些值的显示颜色。
父窗体
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/0eff2efbab6480679ac0a5aeb1669036.jpg)
子窗体
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/8a26d3c7bf46497496b6820e98d0d7c7.jpg)
即当子窗体中QTY输入框输入的值等于DataGridView中ISQTY的值时(小于实现每次输入的累加),修改本条记录的显示颜色为蓝色。当点击返回或是关闭子窗体时(关闭子窗体和返回按钮实现的效果相同,检查子窗体中值的显示颜色,并决定是否要改变父窗体MO列的显示颜色),如果子窗体中的记录都显示为蓝色,要改变父窗体中对应的MO列显示的颜色为蓝色。问题就发生在点击返回或是点击关闭子窗体时。2. 问题的表现及导致发生问题的代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/e91d62130db078a6029c55711cada4e4.jpg)
“返回”按钮的单击事件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/5d796958d6863df85868c0eb8cb10748.jpg)
一个死循环就此诞生,返回按钮的this.Close()方法会导致窗体关闭,从而导致执行FormClosing()窗体事件,而窗体FormClosing()事件调用返回按钮的方法,由此A调用B,B反过来调用A,再也没有结束的机会。4. 问题的解决 知道问题的原因,解决办法总是会有很多种,下面是其中的一种,欢迎你写下自己的想法,分享,共同成长...
窗体之间的传值,如想把子窗体的值传给父窗体,可在父窗体中定义一个Public类型的变量,在子窗体返回时给父窗体的该变量赋值
1. 问题的发生
根据父窗体中的输入值,在数据库中查询资料,并在子窗体加载的时候根据资料的不同显示不同的颜色,子页面中根据输入对数据库中的数据做一些修改,返回父窗体时,检查这些修改,并判断是否要修改父窗体中这些值的显示颜色。
父窗体
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/0eff2efbab6480679ac0a5aeb1669036.jpg)
子窗体
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/8a26d3c7bf46497496b6820e98d0d7c7.jpg)
即当子窗体中QTY输入框输入的值等于DataGridView中ISQTY的值时(小于实现每次输入的累加),修改本条记录的显示颜色为蓝色。当点击返回或是关闭子窗体时(关闭子窗体和返回按钮实现的效果相同,检查子窗体中值的显示颜色,并决定是否要改变父窗体MO列的显示颜色),如果子窗体中的记录都显示为蓝色,要改变父窗体中对应的MO列显示的颜色为蓝色。问题就发生在点击返回或是点击关闭子窗体时。2. 问题的表现及导致发生问题的代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/e91d62130db078a6029c55711cada4e4.jpg)
“返回”按钮的单击事件
private void btnReturn_Click(object sender, EventArgs e) { //-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色-------- #region 返回父窗体 CHECK_MO_MATERIAL cmm = (CHECK_MO_MATERIAL)this.Owner;//CHECK_MO_MATERIAL父窗体的名称 if ( cmm != null ) { cmm.moChangeFlag = moFlag; cmm.ChangeMoColor(); } #endregion this.Close(); }窗体的关闭事件
private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) { btnReturn_Click(sender, e); }到这里你一定发现的问题的发生的,不喜勿碰,本人旨在分享而已。3. 问题的查找 那个报错的图片很大程度会转移注意力,可能是调用的.Net的库的版本不兼容导致的,或是像我一样的不幸运,在自己的电脑上根本就不会发生,这些在很大程度会转移问题的定位,但是到什么时候,都不要Debug!我就一步一步跟着走,看是在哪里走进了死胡同。 如果上面的代码还是没看出来,试着看下面的精简版本
private void btnReturn_Click(object sender, EventArgs e)4. 问题的分析 我只是想在点关闭关闭窗体和返回按钮时实现相同的效果,结果却写出了这么挫的东东,我想剁掉自己的小手手......
{
//-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色--------
this.Close();
}
private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) { btnReturn_Click(sender, e); }
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/27/5d796958d6863df85868c0eb8cb10748.jpg)
一个死循环就此诞生,返回按钮的this.Close()方法会导致窗体关闭,从而导致执行FormClosing()窗体事件,而窗体FormClosing()事件调用返回按钮的方法,由此A调用B,B反过来调用A,再也没有结束的机会。4. 问题的解决 知道问题的原因,解决办法总是会有很多种,下面是其中的一种,欢迎你写下自己的想法,分享,共同成长...
private void btnReturn_Click(object sender, EventArgs e) { this.Close(); } private void CHECK_MO_MATERIAL_CONFIG_FormClosing(object sender, FormClosingEventArgs e) { //-----------------根据子窗体中显示颜色判断是否要改变父窗体中值的显示颜色-------- #region 返回父窗体 CHECK_MO_MATERIAL cmm = (CHECK_MO_MATERIAL)this.Owner;//CHECK_MO_MATERIAL父窗体的名称 if ( cmm != null ) { cmm.moChangeFlag = moFlag; cmm.ChangeMoColor(); } #endregion }4. 你可能学到的小知识 如果FormClosing事件到调用的方法包含关闭当前窗体的方法(如本文中的this.Close()),那么就会导致死循环的发生。
窗体之间的传值,如想把子窗体的值传给父窗体,可在父窗体中定义一个Public类型的变量,在子窗体返回时给父窗体的该变量赋值
#region 父窗体跳轉到子窗體 CHECK_MO_MATERIAL_CONFIG cmmc = new CHECK_MO_MATERIAL_CONFIG();//CHECK_MO_MATERIAL_CONFIG子窗体的名称 cmmc.moFromParantForm = this.tbMo.Text.Trim().ToUpper(); cmmc.opFromParantForm = this.tbOp.Text.Trim().ToUpper(); cmmc.categoryFromParantForm = this.cmbCategory.SelectedItem.ToString(); cmmc.Owner = this; cmmc.Show();//cmmc.ShowDialog();//顯示子窗體,隱藏父窗體 #endregion #region 子窗体返回父窗体 CHECK_MO_MATERIAL cmm = (CHECK_MO_MATERIAL)this.Owner;//CHECK_MO_MATERIAL父窗体的名称 if ( cmm != null ) { cmm.moChangeFlag = moFlag; cmm.ChangeMoColor(); } #endregion设置DataGridView中数值的显示颜色
dgvMoDetails.Rows[i].Cells["時間"].Style.ForeColor = Color.DarkBlue;设置DataGridView列的宽度
this.dgvMoDetails.Columns["時間"].Width = 200;获取或设置DataGridView控件中某一单元格的值
dgvMoDetails.Rows[i].Cells["時間"].Value = "xxxx";点击DataGridView的标题列,禁止刷新(排序)DataGridView中的数据(注意以下方法要在DataGridView控件绑定数据之后执行)
private void ForbidSortColumn(DataGridView dgv) { for ( int i = 0 ; i < dgv.Columns.Count ; i++ ) { dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } }禁止移动窗体(改变窗体的位置)(直接在窗体类中添加以下方法)
protected override void WndProc(ref Message m) { const int WM_NCLBUTTONDOWN = 161; const int WM_SYSCOMMAND = 274; const int HTCAPTION = 2; const int SC_MOVE = 61456; if ( (m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE) ) return; if ( (m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION) ) return; base.WndProc(ref m); }
相关文章推荐
- Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法
- DataGridView控件详细介绍
- C#实现窗体间传递数据实例
- C#模拟MSN窗体抖动的实现代码
- C#设置MDI子窗体只能弹出一个的方法
- ASP.NET页面间的传值的几种方法
- 关于C语言中参数的传值问题
- WinForm窗体间传值的方法
- C#实现随鼠标移动窗体实例
- C#实现窗体与子线程的交互的方法
- C# Winform窗口之间传值的多种方法浅析
- C#中登录窗体和欢迎窗体关闭方法分析
- WinForm实现同时让两个窗体有激活效果的特效实例
- asp.net中使用DatagridView的增删改方法具体实现
- ASP.Net巧用窗体母版页实例
- DataGridView - DataGridViewCheckBoxCell的使用介绍
- Windows窗体的.Net框架绘图技术实现方法
- php下通过POST还是GET来传值
- C# Datagridview绑定List方法代码
- JS中Iframe之间传值的方法