[WPF} обновление UI при insert/delete в БД
От: andr3ya  
Дата: 12.11.08 13:09
Оценка:
Похоже где-то в моей ДНК закралась ошибка, но уже пару дней бъюсь головой об проблему: при выполнении операции добавления и удаления элемента в Table<>, связаные с ним контролы не отображают новый элемент и не удаляют удалённый. При этом обновление содержимого работает нормально, а запросы insert/delete уходят в базу. То есть результат insert/update виден только при следующем запуске программы (SubmitChanges не помогает)

Теперь подробнее. Дано
Таблица в MSSQL2005:
CREATE TABLE [Symptoms](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [dbo].[Title] NOT NULL,
    [Description] [dbo].[Description] NULL,
    [Media] [int] NULL,
    [MainPart] [int] NOT NULL
)

UDT Title и Description это nvarchar и ntext

Для этой таблицы в O/R Designer сделан Entity класс (посредством перетаксивания из Server Explorer), который я не менял

Для всего приложения создаётся экземпляр полученого O/R датаконтекста:
if(DataContext_==null) {
    DataContext_=new DataDataContext();
    DataContext_.ObjectTrackingEnabled=true;
    DataContext_.DeferredLoadingEnabled=true;
}


В xaml выполняется привязка к ListBox:
<CollectionViewSource x:Key="SymptomsDataView" Source="{Binding Source={x:Static Application.Current}, Path=DataContext.Symptoms}" />
......
<ListBox DataContext="{Binding Source={StaticResource SymptomsDataView}} Name="SymptomsList" DisplayMemberPath="Name" ItemsSource="{Binding Path=.,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" />


На той же форме есть кнопка добавить запись с привязаным событием вида:
Symptom s=new Symptom();
s.Name="Новый симптом";
s.AnatomicPart=((App)App.Current).DataContext.AnatomicParts.First();
((App)App.Current).DataContext.Symptoms.InsertOnSubmit(s);
((App)App.Current).DataContext.SubmitChanges();



Если всё это запустить, то в литсбоксе появятся элементы из БД, их даже можно будет поменять посредством detail — части представления, но нажатие на кнопку добавить приводит к тому что в БД запись вставляется, однако её не видно в листбоксе. Тоже самое при операции удаления.
wpf binding linq mssql
Re: [WPF} обновление UI при insert/delete в БД
От: RobertT Россия http://bobbbloggg.blogspot.com/ http://robbbloggg.blogspot.com/
Дата: 14.11.08 08:56
Оценка:
Table<TEntity> не реализует INotifyCollectionChanged, соответственно и GUIни нет возможности узнать об изменениях в коллекции. Оберните Table в ObservableCollection и подсуньте ее CollectionViewSource.
Re: [WPF} обновление UI при insert/delete в БД
От: Ziggi111 Россия  
Дата: 14.11.08 12:06
Оценка:
Здравствуйте, andr3ya, Вы писали:

A>Похоже где-то в моей ДНК закралась ошибка, но уже пару дней бъюсь головой об проблему: при выполнении операции добавления и удаления элемента в Table<>, связаные с ним контролы не отображают новый элемент и не удаляют удалённый. При этом обновление содержимого работает нормально, а запросы insert/delete уходят в базу. То есть результат insert/update виден только при следующем запуске программы (SubmitChanges не помогает)


A>Теперь подробнее. Дано

A>Таблица в MSSQL2005:
A>
A>CREATE TABLE [Symptoms](
A>    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
A>    [Name] [dbo].[Title] NOT NULL,
A>    [Description] [dbo].[Description] NULL,
A>    [Media] [int] NULL,
A>    [MainPart] [int] NOT NULL
A>)
A>

A>UDT Title и Description это nvarchar и ntext

A>Для этой таблицы в O/R Designer сделан Entity класс (посредством перетаксивания из Server Explorer), который я не менял


A>Для всего приложения создаётся экземпляр полученого O/R датаконтекста:

A>
A>if(DataContext_==null) {
A>    DataContext_=new DataDataContext();
A>    DataContext_.ObjectTrackingEnabled=true;
A>    DataContext_.DeferredLoadingEnabled=true;
A>}
A>


A>В xaml выполняется привязка к ListBox:

A>
A><CollectionViewSource x:Key="SymptomsDataView" Source="{Binding Source={x:Static Application.Current}, Path=DataContext.Symptoms}" />
A>......
A><ListBox DataContext="{Binding Source={StaticResource SymptomsDataView}} Name="SymptomsList" DisplayMemberPath="Name" ItemsSource="{Binding Path=.,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" />
A>


A>На той же форме есть кнопка добавить запись с привязаным событием вида:

A>
A>Symptom s=new Symptom();
A>s.Name="Новый симптом";
A>s.AnatomicPart=((App)App.Current).DataContext.AnatomicParts.First();
A>((App)App.Current).DataContext.Symptoms.InsertOnSubmit(s);
A>((App)App.Current).DataContext.SubmitChanges();
A>



A>Если всё это запустить, то в литсбоксе появятся элементы из БД, их даже можно будет поменять посредством detail — части представления, но нажатие на кнопку добавить приводит к тому что в БД запись вставляется, однако её не видно в листбоксе. Тоже самое при операции удаления.

BindingSource.Add (s);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.