wpf datagrid及时更新数据的问题

open382000 2013-12-17 09:32:22
我想实现,在单元格编辑结束的时候datagrid可以及时更新数据,我实现了INotifyPropertyChanged 接口
数据也是结合ObservableCollection进行绑定的。
我在datagrid的 cellEditEnding事件里面对数据进行存储,每次发现会少存一条数据,就是最后编辑的那一条。
我不知道该怎么办。。如何能及时更新数据呢。。
本来的想法是用一个按钮点保存,可是这个想法被否定了。
现在又要实现判断该单元格是否进行修改。好像也不知道从哪个事件入手。。求老师们解答
...全文
2289 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小猪八Q 2016-05-16
  • 打赏
  • 举报
回复
引用 12 楼 AKQJX 的回复:
[quote=引用 8 楼 wpfLove 的回复:]

public class Test
    {
        public string Name { set; get; }
        public Test CloneSource { set; get; }
        public Test Clone()
        {
            return new Test() { Name = this.Name };
        }
    }
获取数据以后,首先复制

public ObservableCollection<Test> CopyList = new ObservableCollection<Test>();
        public ObservableCollection<Test> OriginalSource;
        public void Copy(ObservableCollection<Test> list)
        {
            OriginalSource = list;
            CopyList.Clear();
            foreach(Test item in OriginalSource)
            {
                CopyList.Add(item.Clone());
                CopyList.Last().CloneSource = item;
            }
            //前台绑定ItemsSource为OriginalSource
        }
在用户操作完成以后,退出时,根据情况进行保存,这里只帮你判断下,修改状态

        //在用户操作完成退出时判断是否修改等
        public bool IsChanged()
        {
            //无删除,只需要判断是否有修改即可
            if (CopyList.Count == OriginalSource.Count)
            {
                bool isChanged = false;
                for (int i = 0; i < OriginalSource.Count; i++)
                {
                    if (OriginalSource[i].Name != CopyList[i].Name)
                    {
                        isChanged = true;
                        break;
                    }
                }
                return isChanged;
            }
            return true;
        }
通过Count来判断,不科学吧。 比如我先新增了一条记录,然后又删除了一条记录。[/quote] 是的,需要比对具体的变化,添加或者删除了那些,更新了那些项目
AKQJX 2016-05-11
  • 打赏
  • 举报
回复
引用 8 楼 wpfLove 的回复:

public class Test
    {
        public string Name { set; get; }
        public Test CloneSource { set; get; }
        public Test Clone()
        {
            return new Test() { Name = this.Name };
        }
    }
获取数据以后,首先复制

public ObservableCollection<Test> CopyList = new ObservableCollection<Test>();
        public ObservableCollection<Test> OriginalSource;
        public void Copy(ObservableCollection<Test> list)
        {
            OriginalSource = list;
            CopyList.Clear();
            foreach(Test item in OriginalSource)
            {
                CopyList.Add(item.Clone());
                CopyList.Last().CloneSource = item;
            }
            //前台绑定ItemsSource为OriginalSource
        }
在用户操作完成以后,退出时,根据情况进行保存,这里只帮你判断下,修改状态

        //在用户操作完成退出时判断是否修改等
        public bool IsChanged()
        {
            //无删除,只需要判断是否有修改即可
            if (CopyList.Count == OriginalSource.Count)
            {
                bool isChanged = false;
                for (int i = 0; i < OriginalSource.Count; i++)
                {
                    if (OriginalSource[i].Name != CopyList[i].Name)
                    {
                        isChanged = true;
                        break;
                    }
                }
                return isChanged;
            }
            return true;
        }
通过Count来判断,不科学吧。 比如我先新增了一条记录,然后又删除了一条记录。
小猪八Q 2013-12-27
  • 打赏
  • 举报
回复
引用 10 楼 open382000 的回复:
[quote=引用 8 楼 wpfLove 的回复:]

public class Test
    {
        public string Name { set; get; }
        public Test CloneSource { set; get; }
        public Test Clone()
        {
            return new Test() { Name = this.Name };
        }
    }
获取数据以后,首先复制

public ObservableCollection<Test> CopyList = new ObservableCollection<Test>();
        public ObservableCollection<Test> OriginalSource;
        public void Copy(ObservableCollection<Test> list)
        {
            OriginalSource = list;
            CopyList.Clear();
            foreach(Test item in OriginalSource)
            {
                CopyList.Add(item.Clone());
                CopyList.Last().CloneSource = item;
            }
            //前台绑定ItemsSource为OriginalSource
        }
在用户操作完成以后,退出时,根据情况进行保存,这里只帮你判断下,修改状态

        //在用户操作完成退出时判断是否修改等
        public bool IsChanged()
        {
            //无删除,只需要判断是否有修改即可
            if (CopyList.Count == OriginalSource.Count)
            {
                bool isChanged = false;
                for (int i = 0; i < OriginalSource.Count; i++)
                {
                    if (OriginalSource[i].Name != CopyList[i].Name)
                    {
                        isChanged = true;
                        break;
                    }
                }
                return isChanged;
            }
            return true;
        }
对了 你这个拷贝的方法 我字段里面那么多拷贝之后是否会慢许多。。类中还有类 该如何[/quote] 慢到不至于慢很多,只是多了几个字段的处理而且,类中类也根据情况,如果你的前台操作不涉及到类中类的处理和修改,那可以直接使用,不用copy,而且我这里提供的只是一种copy的方法,其他的你可以搜搜看
open382000 2013-12-27
  • 打赏
  • 举报
回复
引用 8 楼 wpfLove 的回复:

public class Test
    {
        public string Name { set; get; }
        public Test CloneSource { set; get; }
        public Test Clone()
        {
            return new Test() { Name = this.Name };
        }
    }
获取数据以后,首先复制

public ObservableCollection<Test> CopyList = new ObservableCollection<Test>();
        public ObservableCollection<Test> OriginalSource;
        public void Copy(ObservableCollection<Test> list)
        {
            OriginalSource = list;
            CopyList.Clear();
            foreach(Test item in OriginalSource)
            {
                CopyList.Add(item.Clone());
                CopyList.Last().CloneSource = item;
            }
            //前台绑定ItemsSource为OriginalSource
        }
在用户操作完成以后,退出时,根据情况进行保存,这里只帮你判断下,修改状态

        //在用户操作完成退出时判断是否修改等
        public bool IsChanged()
        {
            //无删除,只需要判断是否有修改即可
            if (CopyList.Count == OriginalSource.Count)
            {
                bool isChanged = false;
                for (int i = 0; i < OriginalSource.Count; i++)
                {
                    if (OriginalSource[i].Name != CopyList[i].Name)
                    {
                        isChanged = true;
                        break;
                    }
                }
                return isChanged;
            }
            return true;
        }
对了 你这个拷贝的方法 我字段里面那么多拷贝之后是否会慢许多。。类中还有类 该如何
DL111111 2013-12-24
  • 打赏
  • 举报
回复
如果是binding的话 用bindinglist 这样就不没有问题了!
小猪八Q 2013-12-24
  • 打赏
  • 举报
回复

public class Test
    {
        public string Name { set; get; }
        public Test CloneSource { set; get; }
        public Test Clone()
        {
            return new Test() { Name = this.Name };
        }
    }
获取数据以后,首先复制

public ObservableCollection<Test> CopyList = new ObservableCollection<Test>();
        public ObservableCollection<Test> OriginalSource;
        public void Copy(ObservableCollection<Test> list)
        {
            OriginalSource = list;
            CopyList.Clear();
            foreach(Test item in OriginalSource)
            {
                CopyList.Add(item.Clone());
                CopyList.Last().CloneSource = item;
            }
            //前台绑定ItemsSource为OriginalSource
        }
在用户操作完成以后,退出时,根据情况进行保存,这里只帮你判断下,修改状态

        //在用户操作完成退出时判断是否修改等
        public bool IsChanged()
        {
            //无删除,只需要判断是否有修改即可
            if (CopyList.Count == OriginalSource.Count)
            {
                bool isChanged = false;
                for (int i = 0; i < OriginalSource.Count; i++)
                {
                    if (OriginalSource[i].Name != CopyList[i].Name)
                    {
                        isChanged = true;
                        break;
                    }
                }
                return isChanged;
            }
            return true;
        }
open382000 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 bushiyundeyu 的回复:
换种思路,在每行编辑完之后不管,到最后用户编辑完所有的时候点击保存,然后再保存呢?
我是这么想的。。可是这样用户操作比较频繁。。
open382000 2013-12-24
  • 打赏
  • 举报
回复
引用 4 楼 wpfLove 的回复:
在刚进入窗体,并得到数据源以后,复制并保存一份原始数据; 然后绑定原始数据源也就是最初的ObservationColletion,在你的修改过程中,因为绑定,会自动修改数据源中对应的数据, 最后保存时,比较现在的数据和最初的数据的差异即可
能举个例子吗 我是新手比较模糊这个
黄四郎 2013-12-23
  • 打赏
  • 举报
回复
双向模式的绑定??binding mode=twoway啊!!
小猪八Q 2013-12-22
  • 打赏
  • 举报
回复
在刚进入窗体,并得到数据源以后,复制并保存一份原始数据; 然后绑定原始数据源也就是最初的ObservationColletion,在你的修改过程中,因为绑定,会自动修改数据源中对应的数据, 最后保存时,比较现在的数据和最初的数据的差异即可
Bonjour-你好 2013-12-18
  • 打赏
  • 举报
回复
我认为,如果绑定是“成功”的,那么应该根本不需要cellEditEnding事件中处理“数据存储”吧。 你的“更新数据”是指界面上的更新还是要更新到数据库?如果是更新到数据库,不是绑定了就可以的。。。。。。 判断该单元格是否进行修改,可以在第一次获取数据时,先用一个变量复制一遍数据源,当需要判断时再两者比较。
一只熊猫 2013-12-18
  • 打赏
  • 举报
回复
用离开行的事件触发保存吧
Architecture Net 2013-12-18
  • 打赏
  • 举报
回复
换种思路,在每行编辑完之后不管,到最后用户编辑完所有的时候点击保存,然后再保存呢?

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧