深复制和参数传递方式来完成数据修改操作

在我工作的过程中,曾遇到这样的问题:给一个datagrid(Name=dgData)增加记录的过程中,但是增加进来以后发现增加的记录是空记录。为了解决这个问题,我增加完记录以后还得加一句dgData.Items.Refresh(),加完这句以后果然增加进来了,正要欣喜的时候,大笑然而这时候我才发现,每次增加进来的记录都是相同的。(我设置的值是有区别的。)尴尬
    我这时候变像个丈二的和尚似的摸不着头脑了。想法似乎也没错,这时候唯一的办法便是调试。在调试的过程中才发现,我设定了一个全局变量,都是这个全局变量惹的祸,(问题出在红色标记部分)每次新增完以后,把记录Get完以后,之前新增过的实体都附上了当前页面的值.知道了问题所在,于是我就在新增事件里初始化一个实体,用来存页面值,这时候问题解决了。
   然而修改的时候由于页面中只有一个修改按钮,没有保存按钮,起初我想在修改事件来个深复制,先初始化一个实体,把从datagrid里选择的记录通过深复制的方式把值传递给它。具体想法是:先把dgData中选择的实体通过深复制赋给初始化的实体a,再把页面的值给a,最后把修改前的实体从实体列表中删除,把修改过的实体a增加到实体列表。没调试之前我以为深复制就是增加了一个数据备份,之前的数据没有发生改变,因此这样的删除—新增式的修改方式就似乎有了可能。关键代码如下:

       A _model = new A();
        /// <summary>
        /// A实体属性
        /// </summary>
        public A Model
        {
            get
            {
                GetValue();//将页面值赋给实体
                return _model;
            }

            set
            {
                _model = value;
                SetValue();//将实体值传递到页面
            }

        }
        //用来保存A实体列表
        List<A> listA=new List<A>();

        //将listA加载进dgData
        private void InitData()
        {
            dgData.ItemsSource = listA;
            dgData.Items.Refresh();
        }

       //修改实体的值
       private void btnModify_Click(object sender, RoutedEventArgs e)
        {
            A a=new A();
            if (dgData.SelectedIndex < 0)
            {
                wpfMessageBox.Show("请选择一行数据!");
                return;
            }
            else
            {
                a = ObjectCopier.Clone<A>(Model);
                Get();
                a=_model;
                dgData.Remove(Model);
                listA.Add(a);
                InitData();
            }
               然而这次又遇到新的问题,每次修改完一条记录之后之前的旧数据没有删除掉,直接新增进来一条新数据。疑问通过调试才发现实体Model中有一个GuidID属性,会通过    Guid.NewGuid().ToString();来自动生成,每次执行到a = ObjectCopier.Clone<A>(Model)时,Model里的GuidID会不断发生改变,因此就像打游击战一样,总是神龙见首不见尾,找不着这条记录,删除也就无从谈起。最后实在没有办法了,我就给GetValue()和SetValue()方法里增加了参数,把要修改的实体传进来,这两个方法就变成了GetValue(A a)和SetValue(A a)这次的思路如下:
1.通过dgData的选择事件将要修改的记录传递到页面
代码如下:
        //通过点击datagrid的一行来将值传入页面
        private void dgData_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SetValue(dgData.SelectedItem as A);//把选择的实体值传递到页面
        }
2.将修改后的页面的值赋给初始化的实体

        //修改实体属性
        private void btnModify_Click(object sender, RoutedEventArgs e)
        {
            A model = new A ();
            GetValue(model);//将页面值赋给model
            listA.Remove(dgData.SelectedItem as A);
            listA.Add(model);
            InitData();
        }
  为了解决找不着旧记录的问题,这次我决定不再用全局变量Model,直接删除选定的记录,看它还能有三头六臂不成。经过这么一折腾问题就得到了解决。
  但是我还是想用其他方法,朋友,如果你知道的话,我们可以交流交流,我也可以向你学习学习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值