最近刚接触PDA开发,做了一个小程序,我是这样实现的。列表页在form_load方法中绑定datagrid的数据,然后在新窗体中修改或增加一行新的数据,利用委托实现列表页的及时更新。
菜鸟心得,刚接触winform或者pda开发的朋友也许会有些帮助。不对的地方请不吝批评指正。
DataTable dt= bwork.GetWorks(" 1=1 ").Tables[0]; GridWorks.TableStyles.Add(BulidGridTableStyle(dt)); GridWorks.DataSource = dt;
BulidGridTableStyle(dt)是根据datatable的列自动生成DataGridTableStyle
1 private DataGridTableStyle BulidGridTableStyle(DataTable dt) 2 { 3 DataGridTableStyle ts = new DataGridTableStyle(); 4 ts.MappingName = dt.TableName; 5 int width = GridWorks.Width; 6 for (int i = 0; i < dt.Columns.Count; i++) 7 { 8 DataGridColumnStyle dgstyle = new DataGridTextBoxColumn(); 9 dgstyle.MappingName = dt.Columns[i].ColumnName; 10 dgstyle.HeaderText = dt.Columns[i].ColumnName; 11 12 dgstyle.Width = width / dt.Columns.Count; 13 ts.GridColumnStyles.Add(dgstyle); 14 } 15 return ts; 16 17 18 19 }
显示结果
当我点添加或修改时会打开新窗体,修改时会吧当前选中行的值带过去。
带值就是直接在新窗体里另加了一个构造。
新窗体中的构造方法
1 public WcfOperate(WorkService.WORK wcfwork,bool isinsert) 2 { 3 InitializeComponent(); 4 this.lblid.Text = wcfwork.WORK_ID.ToString(); 5 this.txtname.Text = wcfwork.WORK_NAME.ToString(); 6 this.txtdesc.Text = wcfwork.WORK_DESC.ToString(); 7 this.txtman.Text = wcfwork.WORK_MAN; 8 this.txtstate.Text = wcfwork.WORK_STATE.ToString(); 9 insert = isinsert; 10
列表窗体的修改事件
1 MWork mwork = new MWork(); 2 mwork.WORK_ID = Convert.ToInt32(GridWorks[GridWorks.CurrentRowIndex, 0].ToString()); 3 mwork.WORK_NAME = GridWorks[GridWorks.CurrentRowIndex, 1].ToString(); 4 mwork.WORK_DESC = GridWorks[GridWorks.CurrentRowIndex, 2].ToString(); 5 mwork.WORK_MAN = GridWorks[GridWorks.CurrentRowIndex, 3].ToString(); 6 mwork.WORK_STATE = Convert.ToInt32(GridWorks[GridWorks.CurrentRowIndex, 4].ToString()); 7 8 FormOperate operate = new FormOperate(mwork,false); 9 operate.DataEvent += new FormOperate.ReLoadData(operate_DataEvent); 10 11 operate.Show();
为了实现在新窗体中添加或者修改信息后,列表窗体可以及时显示最新数据,我在新窗体中定义了一个委托及其事件
1 public delegate void ReLoadData(string strWhere); 2 public event ReLoadData DataEvent;
在添加完成之后会触发这个事件
1 if (result)///result/为判断是否插入成功 2 { 3 DataEvent(" 1=1 "); 4 this.Hide(); 5 return; 6 } 7 MessageBox.Show("插入失败");
成功之后会触发事件DataEvent,上文中在列表窗体修改事件打开新窗体时我们就已经注册过了DataEvent事件,
operate.DataEvent += new FormOperate.ReLoadData(operate_DataEvent);然后在建了一个事件出发时调用的方法
operate_DataEvent
CODE 1
1 void operate_DataEvent(string strWhere) 2 { 3 DataTable dt = bwork.GetWorks(" 1=1 ").Tables[0]; 4 5 GridWorks.TableStyles.Add(BulidGridTableStyle(dt)); 6 GridWorks.DataSource = dt; 7 8 }
这样实现DataGrid的数据更新。
问题就出现在这里了。当我更新完一条数据时,出现了异常值不在预期的范围内。 CODE 1 中,我仍然是先把取到的数据放在了datatable中,然后在根据datatable构造GridTableStyle,然后在绑定数据。因为在列表窗体始终是未关闭状态的,其中的TableStyles依然存在。当我更新完之后再次声明了一个GridTableStyle致使与之前的GridTableStyle重复。然后就报错了。也就是说,给他重新加一样的TableStyle就会报错。于是呼就把
GridWorks.TableStyles.Add(BulidGridTableStyle(dt));
这段代码搞掉了,然后运行通过~。
也可以在适当位置加 TableStyles.Clear()这段代码,顾名思义,就是清除掉之前样式。