VamsiPenta Ответов: 3

Как обновить/ перезагрузить все элементы в WPF datagrid


Я извлекаю детали из базы данных sql и показываю их в datagrid, как показано ниже.
using (SqlConnection con = new SqlConnection(UserIDDataTableConnString))
{
    SqlCommand cmd = new SqlCommand("select * from TBL_TicketMngr where Status = 'Follow Up';", con);
    con.Open();
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable("TBL_TicketMngr");
    sda.Fill(dt);
    DG_FollowUp.ItemsSource = dt.DefaultView;
}

XAML для элемента управления DataGrid:
<DataGrid Name="DG_FollowUp"  AutoGenerateColumns="False" SelectionMode="Single" SelectedIndex="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.Row="01" BorderBrush="Black" BorderThickness="0.5" LoadingRow="DG_FollowUp_LoadingRow" IsEnabled="True" IsReadOnly="True" AlternationCount="2" ><!--VirtualizingStackPanel.IsVirtualizing="True"-->
                    <datagrid.columns>                       
                        <DataGridTextColumn Binding="{Binding [TicketID/Subject]}" Header="TicketID/Subject" Width="300" CanUserSort="False"/>
                        <DataGridTextColumn Binding="{Binding [AddDate]}" Header="Start Date" Width="90" CanUserSort="False">
                        <DataGridTextColumn Binding="{Binding [Status]}" Header="Status" Width="80" CanUserSort="False">
                        <DataGridTextColumn Binding="{Binding [OwnerShip]}" Header="Ownership" Width="130" CanUserSort="False">
                        <DataGridTextColumn Binding="{Binding [Comments]}" Header="Comments" Width="300" CanUserSort="False">
                        <DataGridTextColumn Binding="{Binding [SLA DATE]}" Header="SLA Date" Width="90" CanUserSort="False">

Когда пользователь вносит какие-либо изменения в БД, редактируя выбранную строку этой datagrid, datagrid должен быть заполнен недавними datatable.

Я могу получить правильный datatable, но когда он задается как Itemsource для datagrid, он не показывает недавний, а показывает более ранний.

Когда я закрываю приложение и перезапускаю его, оно показывает правильное.

Что я уже пробовал:

Я попробовал Дейтагрид.Предметы.Clear (); но я получаю ошибку " операция недопустима, пока используется ItemsSource. Доступ и изменение элементов с помощью ItemsControl.Вместо этого ItemsSource."

Я попробовал Дейтагрид.Items. refresh (); и Datagrid.UpdateLayout (), но ничего не работает.

Пожалуйста, дайте мне знать, если есть способ достичь этого.

Заранее спасибо

[no name]

DataBind itemsource таблицы данных.

VamsiPenta

Я попробовал, как показано ниже, но это не сработало.
XAMl: & lt;DataGrid Name=" DG_FollowUp " ItemSource={Binding}/>
.в CS: DG_FollowUp.Класс DataContext = ДТ.DefaultView;
но это не сработало.

публичный частичный класс MainWindow : MetroWindow, INotifyPropertyChanged
Я пробовал писать так, но даже тогда это не работало

[no name]

Должен ли я знать, что значит "не сработало"? Вы установили контекст данных? Вы создали свойство для привязки? Вы отладили свое приложение, чтобы выяснить, что означает "не работает"?

VamsiPenta

Когда я устанавливаю datacontext на него, он показывает пустую datgrid и в то же время я не получаю никаких ошибок во время отладки

[no name]

Тогда исправь свою привязку.

VamsiPenta

Вы имеете в виду привязки к каждому столбцу, как я уже упоминал в коде xaml? Если да, то он должен работать, потому что я получаю все значения в первый раз при загрузке приложения

3 Ответов

Рейтинг:
2

#realJSOP

Предполагая, что вы (правильно) привязываетесь к ObservableCollection, вы могли бы попробовать позвонить в OnCollectionChanged метод.

С другой стороны, это должно происходить автоматически, когда элементы в коллекции обновляются/удаляются/вставляются. Это должно мне нравиться либо ваши предметы не являются производными от INotifyPropertyChanged, или ваши товары не находятся в ObservableCollection или оба.

Чистки рядов, я *никогда* для того чтобы напрямую привязать DataTable или dataset в управления интерфейса. Я создаю модель, которая загружается viewmodel, и привязываю viewmodel к элементу управления.


Рейтинг:
1

johannesnestler

просто снова назначьте свой обновленный itemssource -

DG_FollowUp.ItemsSource = dt.DefaultView;


CHill60

Куда бы они его положили? Конечно, связывание - это путь вперед? (Подлинный вопрос, я все еще набираю скорость с некоторыми аспектами WPF)

johannesnestler

Я имел в виду, что он должен просто повторно запустить свой запрос и снова присвоить результат как ItemsSource (единственный известный мне способ "обновить" в этом сценарии). Но я бы никогда не стал следовать такому подходу - я использую MVVM и привязываю ObservableCollections к DataGrid - так что обновления нижележащих данных достаточно. Поэтому не связывайте Таблицы данных напрямую...

VamsiPenta

На самом деле я новичок в WPF. Так как я знаю только этот путь,я продолжил его. Если есть какой-то другой способ достичь вышеперечисленного.пожалуйста, дайте мне знать, чтобы я мог продолжать в том же духе

johannesnestler

нет никакой "проблемы", если вы делаете это таким образом - просто плотное сцепление. В любом случае просто повторно запустить запрос на обновление-(кнопка/событие/что угодно) и переназначать свойство ItemsSource. Если вы новичок в WPF, вам не потребуется много времени, чтобы каким - то образом "познакомиться" с шаблоном MVVM, поэтому я бы рекомендовал немного почитать о нем, чтобы решить, действительно ли это то, что вы хотите...

CHill60

Спасибо за это

Рейтинг:
0

Manuel 1977

<DataGridTextColumn Binding= " {Binding [TicketID/Subject],Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} "Header=" TicketID/Subject "Width=" 300 "CanUserSort= "False"/>