silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了silverlight 子窗体关闭之后刷新父窗体大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

  Your keyword is:  silverlight 子窗体关闭之后刷新父窗体  Powered by: conis.cn 后面一段日子可能时间比较急迫,于是这两天写代码比较赶,大概两天加起来代码写了20来个小时,17000行的样子。在这期间主要就碰到一个比较纠结的问题,专门调试了很久都没有解决,却在吃饭时想着代码一下子豁然开朗了。 一直没有系统地学习Silverlight开发的相关知识
@H_197_13@
 
Your keyword is:  silverlight 子窗体关闭之后刷新父窗体  Powered by: conis.cn

后面一段日子可能时间比较急迫,于是这两天写代码比较赶,大概两天加起来代码写了20来个小时,17000行的样子。在这期间主要就碰到一个比较纠结的问题,专门调试了很久都没有解决,却在吃饭时想着代码一下子豁然开朗了。

一直没有系统地学习Silverlight开发的相关知识,是因为以前有学过Flex方面的RIA开发,所以也就感觉没有必要再花时间学Silverlight细节知识了。直接开始写代码,遇到了这么个最终让我无语凝咽的问题。下面我以我以时间顺序来讲述此问题。

为了讲得更清楚,我先描述一下此问题的“外貌”:

相关背景:父窗体是一个对员工信息的查询窗体,在此窗体点击“编辑”或“增加”按钮后弹出子窗体,在子窗体对某条员工信息进行访问数据库后,父窗体中的DataGrid(sivlerlight中表格数据的展现控件)却始终无法正常得到刷新(有时增加员工后会马上多出一条记录,有时却不会)。

开始时我的代码是这样的(仅列出关键代码):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@H_696_86@ 22
23
24
25
26
27
28
29
30
31
#region 父窗体中的编辑、添加删除按钮的点击事件处理程序
  
private void Edit_Click(object sender,RoutedEventArgs E)
  
{
  
if (SELEctedID == "" )
  
{
  
messageBox.Show( "请先选定一行记录" );
  
return ;
  
}
  
EditOrAddemployee eoa = new EditOrAddemployee(SELEctedID);
  
eoa.Closed += new EventHandler(eoa_Closed);
  
eoa.Show();
@H_696_86@   
}
         public void eoa_Closed(object sender,EventArgs E)
             Search(GetKeshiID(cb_keshi.SELEctedItem), this .txt_GongHao.Text,
                 txt_employeename.Text,txt_Race.Text,txT_BirthPlace.Text,txt_Duty.Text,
                 txt_WorkType.Text,txt_REMARK.Text); @H_251_262@//刷新页面.
             lb_info.Content = "操作成功" ;
             lb_info.Visibility = Visibility.Visible;

子窗体对应的操作数据库方法相关代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@H_696_86@ 22
23
24
private void OKButton_Click(object sender,RoutedEventArgs E)
{
     if (checkInfo() == true )
     {
         if (dp_birthday.SELEctedDate == null )
             dp_birthday.SELEctedDate = System.datetiR_62_11845@e.Today;
             DBO.InsertupdateemployeeByIDCompleted += new EventHandler<INSERTupdatEemploYEEBYIDCOMPLETEDEVENTARGS>           (InsertupdateemployeeByIDCompleted);
             DBO.InsertupdateemployeeByIDAsync(GetKeshiID(cb_KeshiID.SELEctedItem),txt_gonghao.Text,
                 txt_name.Text,txt_identfiycard.Text,cb_sex.SELEctionBoxItem.ToString(),
                 txt_race.Text,dp_birthday.SELEctedDate.ToString(),
                 txT_Birthplace.Text,txt_duty.Text,txt_dutylevel.Text,txt_worktype.Text,txt_REMARK.Text); @H_251_262@//添加用户
         catch (Exception eE)
             messageBox.Show( "OKbutton_click出错" +ee.messagE);
     }
@H_696_86@      this .DialogResult = true ;
}

在上述代码中,在子窗体操作数据库后,子窗体关闭触发父窗体中的eoa_Closed方法,在此方法中进行控件中数据的刷新。可是实际上这种刷新时灵时不灵,这次添加员工刷新了DataGrid,下次删除员工又没有刷新。如此周而复始,始终找不到规律。
调试许久始终找不到哪里出了问题,无奈之下暂时在父窗体中添加一个label提示“操作后数据可能不能及时刷新,若需要请手动刷新。”但这始终不是办法。
结果在吃饭时不由自主地想到了这个错误,思为什么会出现有时刷新数据有时不刷新的情况,突然间想到,莫非是通过Web service访问数据库时效率有快有慢,或许父窗体在子窗体传递的操作数据库请求还未完成时就已进行数据刷新,自然无法取到最新的数据了。迅速吃完饭回来一试,果然如此。我便彻底地了解了Web service访问数据库的令人尴尬之处:子窗体关闭之时,可能其调用的操作数据库方法还未彻底完成。更普遍地说,Web service访问的异步特性,让父窗体可能在子窗体异步请求调用完成之前就进行了数据刷新。
正确的代码
父窗体中代码不需要变化。
子窗体中相关代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@H_696_86@ 22
23
24
25
26
27
private void OKButton_Click(object sender,RoutedEventArgs E)
{
     if (checkInfo() == true )
     {
         if (dp_birthday.SELEctedDate == null )
             dp_birthday.SELEctedDate = System.datetiR_62_11845@e.Today;
             DBO.InsertupdateemployeeByIDCompleted += new EventHandler<INSERTupdatEemploYEEBYIDCOMPLETEDEVENTARGS>(InsertupdateemployeeByIDCompleted);
             DBO.InsertupdateemployeeByIDAsync(GetKeshiID(cb_KeshiID.SELEctedItem),txt_REMARK.Text); @H_251_262@//添加用户
         catch (Exception eE)
             messageBox.Show( "OKbutton_click出错" +ee.messagE);
     }
@H_696_86@ }
 
public void InsertupdateemployeeByIDCompleted(object sender,InsertupdateemployeeByIDCompletedEventArgs E)
{
     this .DialogResult = true ; @H_251_262@//完成后,才关闭子窗体。触发父窗体中设定的委托,进行数据刷新。
}

大家应该已经看到区别,仅有的一处变化是:将this.DialogResult = true;语句放置到访问数据库操作的完成事件委托之中。
含义即:在子窗体操作数据库的异步请求彻底完成,并返回至事件猥琐处的时候,再进行this.DialogResult = true;(该语句会将子窗体关闭,从而调用父窗体中的数据刷新委托方法eoa_Closed。)

记下来以留作备用,并希望能帮助到需要的人。: )

@H_259_801@

大佬总结

以上是大佬教程为你收集整理的silverlight 子窗体关闭之后刷新父窗体全部内容,希望文章能够帮你解决silverlight 子窗体关闭之后刷新父窗体所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。