削除後のDataGridの更新(WPF)

指定:いくつかのデータベースの特定のテーブルのデータを編集するためのWPFアプリケーション。
必須:意図したとおりに機能させるため(Visual Studio 2015を使用)。
Zatyk:「削除」ボタンをクリックした後、グリッド線はそのまま残ります-削除されません。

警告


qw1は提示された資料についてコメントしました。
DataSetは、WPFアプリケーションには不適切なソリューションです。
そして一般的に、このプロジェクトはアーキテクチャ上ひどいものです。多くのコードが存在するため、純粋なMVVMを使用する方が良いでしょう。

データアクセス層(DAL)は、データベースからのデータの読み込みを担当する必要があります。
データは、DataGridのItemsSourceとして割り当てられるObservableCollectionにロードされます。
データ操作コマンドは、DALを呼び出してデータベースからレコードを削除し、同時にコレクションからアイテムを削除します。

結論:この記事で説明されている方法でDataGridを更新することはできませんが、本当に必要な場合は、アプリケーションアーキテクチャをたたくだけです。

開始する


チュートリアルに従ってすべてを行いました(「 ウォークスルー。WPFコントロールをデータセットにバインドする 」)。
そして、すべてが機能し、DELETEボタンを追加するまで問題ありませんでした。
meteoStationsReferenceTableAdapter.Delete(recordIndex); 

悪の根


ステップバイステップガイドでは、[削除]ボタンについて何も言わず、その追加がすべての問題を引き起こしました。
奇妙なことが始まった:

アプリケーションを再度開くと、はい、レコードがありません。つまり、レコードは削除されましたが、DataGridはそれを描画しませんでした。

ソリューションを検索する


「更新」メソッドでDataGridを検索しましたが、驚くほど似たようなものは見つかりませんでした。
Googleに「refresh datagrid wpf c#」を尋ねました。

ItemsSourceをリセット

1) WPFでデータグリッドを更新する方法
 myGrid.ItemsSource = null; myGrid.ItemsSource = myDataSource; 

ItemsSourceの割り当てをどこにも記述しませんでしたが、これがどこにあるのか手がかりがありませんでした-そのようなオプションは適切ではありませんでした。
 <DataGrid x:Name="MeteoStationsReferenceDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="0,52,9.6,10" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserReorderColumns="False"> <DataGrid.Columns> <DataGridTextColumn x:Name="IdColumn" Binding="{Binding id}" Header="id" Width="SizeToHeader"/> <DataGridTextColumn x:Name="NameColumn" Binding="{Binding name}" Header="name" Width="SizeToHeader"/> <DataGridTextColumn x:Name="DescriptionColumn" Binding="{Binding description}" Header="description" Width="SizeToHeader"/> </DataGrid.Columns> </DataGrid> 

ItemsSource = "{Binding}"

また、 ItemsSourceもありません。

表示を更新

2) [WPF] DataGridの更新
最初の2つのオプションが提供されます。
 this.TransactionsDataGrid.ItemsSource = null; this.TransactionsDataGrid.ItemsSource = DataProvider.Instance.GetTransactions(); 

私のデータプロバイダーはどこにあり、何ができるのか、手がかりがありませんでした。
2番目のオプション:
 CollectionViewSource.GetDefaultView(TransactionsDataGrid.ItemsSource).Refresh(); 

それはすでに明らかでした、私は試しました:
決定検証
 var meteoStationsReferenceDataGrid = this.MeteoStationsReferenceDataGrid; if (meteoStationsReferenceDataGrid?.ItemsSource != null) { var collectionView = CollectionViewSource.GetDefaultView( meteoStationsReferenceDataGrid.ItemsSource); collectionView?.Refresh(); } 


何も変更されていません-目的の結果が機能しませんでした。OK、検索を続けましょう。
私がどこでも見ていない限り、 ItemsSourceをリセットして割り当てるオプションがありました。 「 INotifyPropertyChanged Interface 」というオプションもありましたが、私にとっては完全に密集したフォレストです。

解決策


白黒で書かれたレコードを追加/削除した後[Resolved] Refresh DataGridViewリンクをスリップして、Fortuneが微笑むまで検索を続けました。
 Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click '---------------------------------------------------------------------------- Dim newRow = DirectCast(ProduseBindingSource.AddNew(), DataRowView) newRow("pret") = Pret.Text ProduseBindingSource.EndEdit() Me.ProduseTableAdapter.Update(Me.Database1DataSet1) End Sub 

そして、新しいデータを注ぐという意味で、データを再読み取りする必要があることがわかりました。
 /*   */ meteoStationsReferenceTableAdapter.Delete(recordIndex); /*  ClearBeforeFill       */ meteoStationsReferenceTableAdapter.ClearBeforeFill = true ; var meteoStationsReferenceDataSet = this._meteoStationsReferenceDataSet ; if ( meteoStationsReferenceDataSet != null ) { /*   */ meteoStationsReferenceTableAdapter.Fill ( meteoStationsReferenceDataSet.meteo_stations_reference ) ; } 

チェック済み-判明した。
私の好みでは、データセットの再読み込みは、 ItemsSourceをリセットして設定するよりも「文明化された」方法です。
PS
WPFとは友達になりませんでした。

GitHubソース

Source: https://habr.com/ru/post/J279011/


All Articles