削除後の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ソース



All Articles