Как обновить набор данных из доступных для наблюдения коллекций как значения, обновленные в Доступных для наблюдения коллекциях - PullRequest
0 голосов
/ 31 декабря 2010

В настоящее время я работаю над приложением POS & Inventory, я загружаю имеющиеся данные о продуктах и ​​запасах из базы данных в набор данных, а затем набор данных в видимую коллекцию. наконец, видимая коллекция привязана к элементам управления пользовательского интерфейса, таким как сетка данных и представление списка.

Теперь я хочу обновить изменения, сделанные в наблюдаемой коллекции пользователем с помощью элементов управления пользовательского интерфейса. в набор данных, а затем в файл базы данных (SDF) ... пожалуйста, покажите возможную кодировку для обновления набора данных из наблюдаемой коллекции при изменении наблюдаемой коллекции

Один из наших друзей на этом форуме привел пример преобразования набора данных в видимую коллекцию. Я попробовал это и работал хорошо.

код выглядит так 1. Класс Person для хранения данных My 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")
}));

работает хорошо, теперь, двигаясь дальше, я хочу обновить обратно набор данных из видимой коллекции, так как изменения в ObseravableCollection в записях UI Datagrid изменяются

объясните, пожалуйста, о возможном кодировании для выполнения этой задачи.

Ответы [ 3 ]

1 голос
/ 15 апреля 2011

Вы можете использовать отфильтрованный источник коллекционного представления для двух хороших мыслей: 1 - это не новая коллекция (меньше памяти)2 - это как набор указателей на вашем столе с возможностью двухстороннего связывания данных.

0 голосов
/ 01 января 2011

Помимо решения @ ArsenMkrt-s вы также можете подумать об использовании строго типизированного набора данных , который будет иметь класс PersonTable вместо наблюдаемой коллекции и класс PersonRow вместо текущего класса Person.

Они также могут быть связаны с сеткой данных.

Преимущество: код преобразования не требуется.

0 голосов
/ 31 декабря 2010

Я вижу два варианта

. Во-первых, вы можете подписаться на событие PropertyChanged каждого объекта в ObservableCollection и на событие CollectionChanged ObservableCollection, чтобы синхронизировать эти 2 структуры данных

, а во-вторых, чтоЯ думаю, что проще реализовать, это создать свойство с неизмененными, добавленными, измененными, удаленными перечислениями в вашем классе, установить это свойство в зависимости от действий пользователя и преобразовать его в 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)
}));

, и можете конвертировать из наблюдаемой коллекции в набор данных, используя противоположный запрос

EDIT

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

Я не нахожу способ создать набор данных и с Linq, но вот немного хакерский метод, чтобы сделать то, что вы хотите

        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();
            }
        }
...