silverlight子窗体操作数据库后刷新父窗体

 

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

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

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

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

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

#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;
}

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

        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 (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访问的异步特性,让父窗体可能在子窗体异步请求调用完成之前就进行了数据刷新。
正确的代码:
父窗体中代码不需要变化。
子窗体中相关代码如下:

        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(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);
}
}
} public void InsertUpdateEmployeeByIDCompleted(object sender,InsertUpdateEmployeeByIDCompletedEventArgs e)
{
this.DialogResult = true;//完成后,才关闭子窗体。触发父窗体中设定的委托,进行数据刷新。
}

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

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

silverlight子窗体操作数据库后刷新父窗体的更多相关文章

  1. Jbox 弹出窗口 子页面操作完成后关闭 父页面刷新

    父页面js //父页面js <script> var isFreshFlag = '1'; //添加会议活动 function addMeetingAct(){ var attendVip ...

  2. Winfrom子窗体刷新父窗体

    本人比较懒,直接从网上转载了一篇比较合适的文章,只是文章格式有点乱,地址是 http://aspnet.blog.163.com/blog/static/17515510920121126104433 ...

  3. Winform子窗体刷新父窗体

    调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...} ...

  4. js实现非模态窗口增加数据后刷新父窗口数据

    父窗口是由两个部分组成,一个html的table,一部分是extjs的gird. 点击grid面板[增加]按钮将会弹出非模态窗口进行新数据的编辑页面 下面是按钮的触发函数代码: var a = win ...

  5. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  6. Winform中如何实现子窗体刷新父窗体

    原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...

  7. Winform 子窗体设置刷新父窗体

    方法1:所有权法 父窗体:Form1    子窗体:Form2 //Form1:窗体代码 //需要有一个公共的刷新方法 public void Refresh_Method() { //... } / ...

  8. js后台提交成功后 关闭当前页 并刷新父窗体(转)

    原文地址:http://www.cnblogs.com/chenghu/p/3696433.html 后台提交成功后 关闭当前页 并刷新父窗体 this.ClientScript.RegisterSt ...

  9. js后台提交成功后 关闭当前页 并刷新父窗体

    后台提交成功后 关闭当前页 并刷新父窗体 this.ClientScript.RegisterStartupScript(this.GetType(), "message", &q ...

随机推荐

  1. 谷歌浏览器修改CSS和js后同步保存到文件中 (译)

    本文标题:谷歌浏览器修改CSS和js后同步保存到文件中. 文本作者:魔芋铃. 英文原文:http://www.stephensaw.me/google-chrome-devtools-source-m ...

  2. 大数据学习——hive数据类型

    1. hive的数据类型Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型2. hive基本数据类型基础数据类型包括:TINYINT,SMALLINT,INT,BIGIN ...

  3. 大数据学习——linux常用命令(二)四

    系统管理操作 1 挂载外部存储设备 可以挂载光盘.硬盘.磁带.光盘镜像文件等 1/ 挂载光驱 mkdir   /mnt/cdrom      创建一个目录,用来挂载 mount -t iso9660 ...

  4. javascript、jquery 、C#、sqlserveer、mysql、oracle中字符串截取的区别和用法

    下标从0开始 ,并且包括起始位 javascript 中字符串截取 : substring(Number start,Number end) var substr = "liuguangfa ...

  5. bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解

    题意: 一棵n个节点的树,节点有黑白两种颜色,初始均为白色.两种操作:1.更改一个节点的颜色;2.询问一个节点所处的颜色相同的联通块的大小. 思路: 1.每个节点记录仅考虑其子树时,假设其为黑色时所处 ...

  6. [HDU3065]病毒持续侵袭中(AC自动机)

    传送门 AC自动机的又一模板,统计每个字符串在文本中的次数. 所以就不需要vis数组了. ——代码 #include <cstdio> #include <cstring> # ...

  7. hdu 3879 最大密集子图(点和边均带权)(模板)

    /* 最大权闭合图,可以用最大密集子图来解速度更快复杂度低 题解:胡伯涛<最小割模型在信息学竞赛中的应用> 点和边均带权的最大密集子图 s-i,权为U=点权绝对值和+边的所有权值 i-t, ...

  8. 前端学习之--html

    html 文件就是充当模板使用,包含head头和body身体,body包含众多的标签,每个标签都使用尖括号包裹,内部由标签名和标签属性构成.其中标签分为2类: 1:块级标签,特点:占用一行,如:< ...

  9. Java中Cookie常用操作类(Spring中操作Cookie)

    说明:Cookie下用Key取值没有快速的方法,只能便利循环去取. 技巧:置0则cookie会立即删除,设置-1,负值则会在关闭浏览器后删除.切记一定要增加路径:setPath("/&quo ...

  10. java 实现打印当前月份的日历

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTc0NTQwMTk5MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...