1、应用场景
一窗体(FormA)采用datagridview 等数据显示控件显示数据,须要双击其中的数据在另外一个窗体(FormB)显示其详细信息并能够进行修改,当其修改完毕后,FormA窗体显示更新过的数据,每当在FromB中添加的数据都能实时的显示在FormA的数据显示控件中。
2、解决方案思考
web
咱们不难看出,其实咱们要求的结果就是当FormB完成操做之后能回传FormA一个信息,告诉他完成的什么操做,和是否完成,FormA根据返回的状态信息,来决定本身须要作些什么。3、经过事件完成更新操做
一、设置FormB为ShowDialog方式打开,操做完成后返回窗体状态,FormA经过判断窗体的窗体来决定是否从新刷新数据。
缺点:刷新数据可能须要从新载入数据,对于从数据库中载入来讲,大数据量将会是噩梦,并且由于是ShowDialog方式打开,在进行修改等操做时,其余操做其余窗体,必须等待完成。
二、在FormA窗体中定义操做数据显示控件的委托方法,在打开FormB窗体时,将委托实例传递给FromB,在FormB完成修改等操做时,调用委托方法,实现实时修改显示。
缺点:当FormA关闭时,委托调用会失败,但解决了第一种方案的问题。
三、经过事件来同步更新数据,这篇文章主要简单介绍如何经过事件来解决咱们这个问题,下面将详细讲下方法。
一、在FormB中定义委托和相应事件,代码以下:4、小结
/// <summary> /// 添加新行完成后 /// </summary> /// <param name="newRowData">新行数据</param> public delegate void CompleteAddHandler(string[] newRowData); /// <summary> /// 修改数据完成后 /// </summary> /// <param name="editRowData">修改事后的数据</param> /// <param name="rowIndex">在datagridview中的行索引</param> public delegate void CompleteEditHandler(string[] editRowData, int rowIndex); //如下定义事件 public event CompleteAddHandler CompleteAddEventHandler; public event CompleteEditHandler CompleteEditEventHandler;注:这里只是个示例,你们能够根据本身的实际状况来定义委托和事件,来完成相应的操做。
二、在完成操做后调用事件代码,好比如下代码:
1: private void button1_Click(object sender, EventArgs e) 2: { 3: ///上面完成修改操做 4: if (CompleteEditEventHandler != null) 5: CompleteEditEventHandler(editedRowData, RowIndex); 6: }
注:这里if(CompleteEditEventHandler!=null)是判断有哪一个窗体订阅了这个事件。 三、而后在FormA中调用FormB的时候这样写:
1: private void button2_Click(object sender, EventArgs e) 2: { 3: DataGridViewRow dr = this.dataGridView1.CurrentRow; 4: if (dr != null) 5: { 6: string[] edit = { dr.Cells[0].Value.ToString(),dr.Cells[1].Value.ToString(),dr.Cells[2].Value.ToString()}; 7: MothedForm editForm = new MothedForm(edit, dr.Index); 8: editForm.CompleteEditEventHandler += new MothedForm.CompleteEditHandler(editForm_CompleteEditEventHandler); 9: editForm.Show(); 10: } 11: }
这里定义了处理事件,在FormA中的editForm_CompleteEditEventHandler中处理那边触发了事件传递过来的数据,咱们要作的就是把接收过来的数据放到咱们要显示的控件上。
今天有点累,写的不是不少,可是把大概过程写出来了,可能有些问题我写的不够入木三分,也可能有我本身理解不对的地方,也欢迎你们指正。附件传一下详细的测试代码,代码注释很详细。 有问题的也能够跟贴提出,你们一块儿学习。