Datagrid в WPF и sql datatable против других методов

#wpf #datagrid

#wpf #datagrid

Вопрос:

Вот что я пытался сделать.. Я хочу обеспечить редактирование продуктов на месте в datagrid. Сначала я завернул в ObservableCollection a List<Product> и реализовал интерфейс INotifyPropertyChanged для каждого POCO. Отмена изменений и отслеживание того, что изменилось, для фиксации кажется сложным, и у меня было много проблем.. Также я чувствую, что создавать так много обработчиков событий для каждого отдельного poco при изменении свойства не очень странно…
Итак, я спрашиваю, решает ли DataTable эти проблемы? Даже это решает, как насчет проверки?Он ничего не знает о POCO…. Есть ли другие лучшие решения для этого??

Комментарии:

1. Вы работаете с ObservableCollection<List<Product>> or ObservableCollection<Product> ?

2. первый, в список источников

Ответ №1:

Обработчики изменения свойств не так уж и плохи. Вот пример:

 // Hook up a CollectionChanged event
ProductCollection.CollectionChanged  = ProductCollection_Changed;

// In the Collection Changed event, hook up a PropertyChanged event
void ProductCollection_Changed(object sender, CollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        foreach(Product item in e.NewItems)
            item.PropertyChanged  = Product.PropertyChanged;
    }

    if (e.OldItems != null)
    {
        foreach(Product item in e.OldItems)
            item.PropertyChanged -= Product.PropertyChanged;
    }
}

// In the Product property changed event, do something.
// Usually I only use this for raising the CollectionChanged event when
// a property of an object inside a collection changes.
void Product_Changed(object sender, PropertyChangedEventArgs e)
{

}
  

Лично я бы предпочел, чтобы каждый Product отслеживал свои собственные изменения, а не отслеживал их в ViewModel. При первом создании продукта сохраните копию исходных данных и предоставьте что-то вроде UndoChanges() метода, который просто перезагружает исходные данные.

Чтобы отслеживать изменения в отдельных свойствах, я бы сделал это в set методе каждого Product свойства. Это связано с тем, что PropertyChanged событие может быть вызвано вручную и не обязательно означает, что свойство изменилось.

 private int _someValue;
public int SomeValue
{
    get { return _someValue; }
    set
    {
        if (value != _someValue)
        {
            // Track what's changed here. 
            // How you do it is based on what you want to track
            if (!ChangedProperties.Keys.Contains("SomeValue"))
            {
                ChangedProperties.Add(
                    new KeyValuePair<string, object>("SomeValue", _someValue));
            }

            _someValue = value;
            RaisePropertyChanged("SomeValue");
        }
    }
}
  

Комментарии:

1. ну, в вашем первом примере, который будет работать только для новых элементов. Как насчет существующих продуктов? Должен ли я повторять каждый продукт в начале?

2. @Parhs При условии, что вы подключаете CollectionChanged событие до заполнения ObservableCollection , первый пример будет выполняться и для ваших начальных элементов. Если нет, вам придется вручную перебирать элементы после начальной загрузки и подключать их PropertyChanged события таким же образом.

Ответ №2:

DataTable решает несколько вещей…

  1. Когда вы не уверены, сколько столбцов у вас будет.
  2. При частых изменениях изменения вносятся в таблицу данных, и если таблица данных имеет ограничения, они выдают ошибку из-за недопустимых записей. Таким образом, поддерживается некоторый уровень проверки и целостности данных.
  3. Будучи доступными для запросов, таблицы данных выдают более быстрые результаты при сортировке и фильтрации с помощью их DefaultView, т.Е. DataView .

Сказав это…

  1. Частые обновления лучше достигаются за счет наблюдаемой коллекции с внедрением каждого элемента INotifypropertyChanged .
  2. Использование проверок Bindings легко достижимо.
  3. Datagrid предоставляет больше возможностей для объектной модели коллекций, чем таблицы данных.

Так что, в конечном счете, это ваш выбор. Однако я не возражаю против наблюдаемых коллекций и уведомлений INotifyPropertyChanged, поскольку они, похоже, извлекают максимум пользы из WPF DataGrid … с точки зрения стиля и производительности.

Комментарии:

1. Я хочу добиться массового редактирования. Однако, используя уведомления, я должен отслеживать, какие строки изменились, поэтому другого решения для этого нет? С datatable Сложнее выполнять проверки и т. Д.?

2. Это то, что я сказал, я все еще думаю ObservableCollection , и INotifyPropertyChanged это хорошо. Они предложат вам частые изменения и проверки на основе привязки.

3. я не знаю, почему я не могу найти какой-либо образец в Интернете, кроме конкретного datatable. Знать, какие строки изменились, кажется нормальным и простым, но кажется слишком сложным не создавать запрос на обновление для полного poco.