• wince PDA 关于DataGrid 绑定、列宽 及“值不在预期的范围内”异常


    最近刚接触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()这段代码,顾名思义,就是清除掉之前样式。

      




     
  • 相关阅读:
    记忆化搜索 E
    网络流 O
    线段树 B数据结构 牛客练习赛28
    N
    线段树 G
    K
    F
    补一下昨天的博客 J
    selenium-1-python
    selenium入门知识
  • 原文地址:https://www.cnblogs.com/MLGB/p/3128220.html
Copyright © 2020-2023  润新知