前提・実現したいこと
初めて投稿します。C#初心者です。現在サイトや本で調べながらアプリケーションを制作しています。
言葉などが変な場合があるかもしれません。ご了承頂ければと思います。
WPFにDataGridをセットし、SQLiteを使用してテーブルを取得して表示させています。
DataGridへSQLiteでDataTableからObservableCollectionにしてバインディングしています。
また、DataGridに直接データを入力し、入力完了のタイミングでテーブルを更新したいと考えています。
発生している問題・エラーメッセージ
色々サイト等を調べてSQLiteでDataTableを使用してDataGridに表示する事までは出来ましたが、 DataGridに直接データ入力後にテーブルを更新する方法が調べても方法が分かりませんでした。
該当のソースコード
XAML
1<Window x:Class="SqlDataTable.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:SqlDataTable" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="450"> 9 <Grid> 10 <DataGrid x:Name="DataGrid" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,10,0,10" Width="200" AutoGenerateColumns="False"> 11 <DataGrid.Columns> 12 <DataGridTextColumn Binding="{Binding BindingName}" Header="氏名" Width="100"></DataGridTextColumn> 13 <DataGridTextColumn Binding="{Binding BindingComment}" Header="コメント" Width="100"></DataGridTextColumn> 14 </DataGrid.Columns> 15 </DataGrid> 16 17 </Grid> 18</Window> 19
C#
1using System; 2using System.Linq; 3using System.Windows; 4using System.Windows.Controls; 5using System.Data; 6using System.Collections.ObjectModel; 7using System.Data.SQLite; 8 9 10namespace SqlDataTable 11{ 12 /// <summary> 13 /// MainWindow.xaml の相互作用ロジック 14 /// </summary> 15 public partial class MainWindow : Window 16 { 17 DataTable table = new DataTable(); 18 ObservableCollection<NameClass> Names = new ObservableCollection<NameClass>(); 19 20 public MainWindow() 21 { 22 InitializeComponent(); 23 24 25 using (SQLiteConnection connection = new SQLiteConnection("Data Source=Database.db")) 26 { 27 try 28 { 29 connection.Open(); 30 } 31 catch (Exception e) 32 { 33 MessageBox.Show(e.Message); 34 } 35 } 36 37 table = DataBaseLoad(); 38 39 var t = from range in table.AsEnumerable() select range; 40 foreach (var range in t) 41 { 42 NameClass name = new NameClass(); 43 name.BindingName = range.Field<string>("氏名"); 44 name.BindingComment = range.Field<string>("コメント"); 45 Names.Add(name); 46 } 47 DataGrid.DataContext = this.Names; 48 } 49 50 public DataTable DataBaseLoad() 51 { 52 using (SQLiteConnection connection = new SQLiteConnection("Data Source=Database.db")) 53 { 54 var dt = new DataTable(); //検査員用データテーブル作成 55 var adapter = new SQLiteDataAdapter("SELECT * FROM t_table", connection); //SQL実行 56 57 adapter.Fill(dt); 58 59 return dt; 60 } 61 } 62 } 63 64 public class NameClass 65 { 66 public string BindingName { get; set; } 67 public string BindingComment { get; set; } 68 } 69} 70
試したこと
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
回答1件
あなたの回答
tips
プレビュー