前提・実現したいこと
初めて投稿します。C#初心者です。現在サイトや本で調べながらアプリケーションを制作しています。
言葉などが変な場合があるかもしれません。ご了承頂ければと思います。
WPFにDataGridをセットし、SQLiteを使用してテーブルを取得して表示させています。
DataGridへSQLiteでDataTableからObservableCollectionにしてバインディングしています。
また、DataGridに直接データを入力し、入力完了のタイミングでテーブルを更新したいと考えています。
発生している問題・エラーメッセージ
色々サイト等を調べてSQLiteでDataTableを使用してDataGridに表示する事までは出来ましたが、 DataGridに直接データ入力後にテーブルを更新する方法が調べても方法が分かりませんでした。
該当のソースコード
XAML
<Window x:Class="SqlDataTable.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:SqlDataTable" mc:Ignorable="d" Title="MainWindow" Height="450" Width="450"> <Grid> <DataGrid x:Name="DataGrid" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,10,0,10" Width="200" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding BindingName}" Header="氏名" Width="100"></DataGridTextColumn> <DataGridTextColumn Binding="{Binding BindingComment}" Header="コメント" Width="100"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
C#
using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Data; using System.Collections.ObjectModel; using System.Data.SQLite; namespace SqlDataTable { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { DataTable table = new DataTable(); ObservableCollection<NameClass> Names = new ObservableCollection<NameClass>(); public MainWindow() { InitializeComponent(); using (SQLiteConnection connection = new SQLiteConnection("Data Source=Database.db")) { try { connection.Open(); } catch (Exception e) { MessageBox.Show(e.Message); } } table = DataBaseLoad(); var t = from range in table.AsEnumerable() select range; foreach (var range in t) { NameClass name = new NameClass(); name.BindingName = range.Field<string>("氏名"); name.BindingComment = range.Field<string>("コメント"); Names.Add(name); } DataGrid.DataContext = this.Names; } public DataTable DataBaseLoad() { using (SQLiteConnection connection = new SQLiteConnection("Data Source=Database.db")) { var dt = new DataTable(); //検査員用データテーブル作成 var adapter = new SQLiteDataAdapter("SELECT * FROM t_table", connection); //SQL実行 adapter.Fill(dt); return dt; } } } public class NameClass { public string BindingName { get; set; } public string BindingComment { get; set; } } }
試したこと
DataTableだとDataAdapterのUpdateメソッドを使用すれば良いと思ったので、ObservableCollectionとDataTableとで中身を比較して、無いデータをDataTableに挿入すれば良いのかと考え、foreachで回してみましたが、DataTable側に要素が一つ足りないので例外が発生してしまいました。
何か根本的に違う気がしています。
DataGridへの入力後のイベントはObservableCollectionの変更通知かDataGridのCellEditEndingイベントを考えています。
ObservableCollectionからDataTableへ変換する方法はあるのでしょうか。
それとも最初のDataGridへの入力の時点から間違っているのでしょうか。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
使用ツール:Visual Studio Express 2017
.NET Framework Version 4.61
まだ回答がついていません
会員登録して回答してみよう