silverlight 子窗体关闭之后刷新父窗体

silverlight 子窗体关闭之后刷新父窗体,第1张

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

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

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

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

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

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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();    }          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); //刷新页面.              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 22 23 24 private voID OKbutton_Click(object sender,RoutedEventArgs e) {      if (CheckInfo() == true )      {          if (dp_birthday.SelectedDate == null )          {              dp_birthday.SelectedDate = System.DateTime.Today;          }          try          {              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); //添加用户          }          catch (Exception ee)          {              MessageBox.Show( "OKbutton_click出错" +ee.Message);          }      }      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 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.DateTime.Today;          }          try          {              DBO.InsertUpdateEmployeeByIDCompleted += new EventHandler<INSERTUPDATEEMPLOYEEBYIDCOMPLETEDEVENTARGS>(InsertUpdateEmployeeByIDCompleted);              DBO.InsertUpdateEmployeeByIDAsync(GetKeshiID(cb_KeshiID.SelectedItem),txt_remark.Text); //添加用户          }          catch (Exception ee)          {              MessageBox.Show( "OKbutton_click出错" +ee.Message);          }      } }   public voID InsertUpdateEmployeeByIDCompleted(object sender,InsertUpdateEmployeeByIDCompletedEventArgs e) {      this .DialogResult = true ; //完成后,才关闭子窗体。触发父窗体中设定的委托,进行数据刷新。 }

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

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

Kant/文字/邹剑波的原创文章,转载请注明: 转载自Kant's House 热爱产品管理 Never Stop

本文链接地址: silverlight子窗体 *** 作数据库后刷新父窗体

总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1073264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存