必須:意図したとおりに機能させるため(Visual Studio 2015を使用)。
Zatyk:「削除」ボタンをクリックした後、グリッド線はそのまま残ります-削除されません。
警告
qw1は提示された資料についてコメントしました。
DataSetは、WPFアプリケーションには不適切なソリューションです。
そして一般的に、このプロジェクトはアーキテクチャ上ひどいものです。多くのコードが存在するため、純粋なMVVMを使用する方が良いでしょう。
データアクセス層(DAL)は、データベースからのデータの読み込みを担当する必要があります。
データは、DataGridのItemsSourceとして割り当てられるObservableCollectionにロードされます。
データ操作コマンドは、DALを呼び出してデータベースからレコードを削除し、同時にコレクションからアイテムを削除します。
結論:この記事で説明されている方法でDataGridを更新することはできませんが、本当に必要な場合は、アプリケーションアーキテクチャをたたくだけです。
開始する
チュートリアルに従ってすべてを行いました(「 ウォークスルー。WPFコントロールをデータセットにバインドする 」)。
そして、すべてが機能し、DELETEボタンを追加するまで問題ありませんでした。
meteoStationsReferenceTableAdapter.Delete(recordIndex);
悪の根
ステップバイステップガイドでは、[削除]ボタンについて何も言わず、その追加がすべての問題を引き起こしました。
奇妙なことが始まった:
- アプリケーションを開く
- DataGridが自動的にプレートをロードします
- 削除ボタンを押します
- そして何も起こりません!
アプリケーションを再度開くと、はい、レコードがありません。つまり、レコードは削除されましたが、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ソース