【问题标题】:how to update dataset from obseravable collections as values updated in Obseravable collections如何将可观察集合中的数据集更新为可观察集合中更新的值
【发布时间】:2010-12-31 08:17:17
【问题描述】:

我目前正在研究 POS 和库存应用程序,我正在将产品和库存可用数据从数据库加载到数据集,然后将数据集加载到可观察的集合。最终 observable 集合绑定到 UI 控件,如数据网格和列表视图。

现在,我想更新用户使用 UI 控件在可观察集合中所做的更改 到数据集,然后到数据库文件(SDF)...请显示可能的编码,以从可观察的集合更新数据集作为可观察的集合更改

我们在这个论坛的一位朋友给出了一个将数据集转换为可观察集合的示例。我试过了,效果很好。

代码是这样的 1. 保存 My Person 数据的 Person 类:

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

然后使用 LINQ 填充 My ObservableCollection:

var people = new ObservableCollection<Person>(
dataset.Tables["Person"].AsEnumerable().Select(p => new Person
{
    Id = p.Field<int>("Id"),
    Name = p.Field<string>("Name"),
    Age = p.Field<int>("Age")
}));

它工作得很好,现在,随着 UI Datagrid 条目中 ObseravableCollection 的变化,我想从 obseravable 集合中更新回数据集

请向我解释一下实现此任务的可能编码。

【问题讨论】:

    标签: c# wpf observablecollection


    【解决方案1】:

    我看到两个选项

    首先你可以订阅 ObservableCollection 中每个对象的 PropertyChanged 事件,并订阅 ObservableCollection 的 CollectionChanged 事件来保持这两个数据结构的同步

    第二个我认为更容易实现的方法是在您的类中创建具有未更改、添加、修改、删除枚举值的属性,根据用户操作设置此属性,并在保存时将其转换为 DataSet

    编辑

    这是第二种方法的简单实现

    像这样创建枚举

    public enum DataObjectState
    {
      Unchanged,
      Added,
      Modified,
      Deleted
    }
    

    比像这样向你的类添加属性

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public DataObjectState ObjectState{get;set;}
    }
    

    之后你可以像你展示的那样创建 ObservableCollection 表单数据集

    dataset.Tables["Person"].AsEnumerable().Select(p => new Person
    {
        Id = p.Field<int>("Id"),
        Name = p.Field<string>("Name"),
        Age = p.Field<int>("Age"),
        ObjectState = ConvertRowStateToObjectState(p.RowState)
    }));
    

    并且可以使用相反的查询将 observablecollection 转换为数据集

    编辑

    private DataObjectState ConvertRowStateToObjectState(DataRowState dataRowState)
            {
                return (DataObjectState)Enum.Parse(typeof(DataObjectState), dataRowState.ToString());
            }
    

    我也没有找到用 Linq 创建数据集的方法,但这里有一些 hack 方法来做你想做的事

            DataTable personsTable = new DataTable("Person");
            personsTable.Columns.Add("Id", typeof(int));
            personsTable.Columns.Add("Name", typeof(string));
            personsTable.Columns.Add("Age", typeof(int));
    
            foreach (var item in collection)
            {
                DataRow row = personsTable.NewRow();
                row["Id"] = item.Id;
                row["Name"] = item.Name;
                row["Age"] = item.Age;
                personsTable.Rows.Add(row);
                if (item.ObjectState == DataObjectState.Added)
                {
                    continue;
                }
                row.AcceptChanges();
                if (item.ObjectState == DataObjectState.Deleted)
                {                   
                    row.Delete();
                }
                else if (item.ObjectState == DataObjectState.Modified)
                {
                    row.BeginEdit();
                    row.EndEdit();
                }
            }
    

    【讨论】:

    • 我正在寻找上述问题的示例,您能否通过上述示例帮助我,并向我展示完成任务的可能代码。为了更清楚,我修改了我之前的问题,请..帮我解决问题
    • 非常感谢您,我很抱歉在这个话题上拖了您的后腿。我不知道“从 observablecollection 转换为数据集”的其余编码我在网上搜索了网络中的代码我一无所获,请(如果时间允许)显示将 Observable 集合转换为 datset 的代码,我我是这个平台的新手。请。
    【解决方案2】:

    除了@ArsenMkrt-s 解决方案,您还可以考虑使用 强类型数据集,该数据集将具有 PersonTable 类而不是可观察的 Collection 和 PersonRow 类而不是您当前的 Person-Class .

    这些也可以绑定到数据网格。

    好处:不需要转换代码。

    【讨论】:

      【解决方案3】:

      您可以使用过滤后的 collectionviewsource 来获得 2 个好的想法: 1-这不是一个新集合(内存需求较少)。 2-它就像您的 Table 上的指针集合,具有 2 种方式数据绑定功能。

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多