質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

【C#】【WPF】【SQLite】DataGridに入力したデータをSQLiteで更新したい

noppa
noppa

総合スコア2

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

0評価

0クリップ

585閲覧

投稿2021/12/23 06:45

前提・実現したいこと

初めて投稿します。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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

TN8001

2021/12/23 08:25

(わたしはDB関係全然わかっていませんが) DataTableを使うなら、そのままDataGridにバインドすればよくないですか?
SurferOnWww

2021/12/23 08:36

どうしても WPF ということでなければ Windows Form + 型付 DataSet/DataTable/TableAdapter + DataGridView にしてはいかが? 以下の記事の図1と図2を見てください。図2の DataSet の左側に DaraGridView があるという形になります。 DB 設計者のための明解 ADO.NET 第 1 回 https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)
noppa

2021/12/23 09:09

TN8001様 ご回答頂きありがとうございます。 そのままDataGridにバインドについては、行幅固定・行ヘッダがテーブルと違う為ObservableCollectionを使用しました。(テーブルの値だけを表示したかったです) SurferOnWww様 ご回答頂きありがとうございます。 WPFを使用した理由については初めてC#を使用する為、FormよりWPFの方がいいかなと安易に考えた事と、画面を最大化した場合、表示が崩れる為です。 (通常画面と最大化画面で比率を保ちたい)
TN8001

2021/12/23 09:46

> そのままDataGridにバインドについては、行幅固定・行ヘッダがテーブルと違う為ObservableCollectionを使用しました。 一部だけ出したいということであれば、今と同じようにDataGridTextColumn等を作るだけですよ? Binding="{Binding カラム名}" とDataTableのカラム名で指定もできますし、 Binding="{Binding [0]}" とインデクサでもいいです。 カラム名に記号類が入る可能性がある場合は、インデクサが安全かもしれません。 [DataGridとDataTable(その2)【WPF編】 | 泥庭](https://yone64.wordpress.com/2014/12/05/datagrid%e3%81%a8datatable%ef%bc%88%e3%81%9d%e3%81%ae2%ef%bc%89%e3%80%90wpf%e7%b7%a8%e3%80%91/ [data binding - What is it about DataTable Column Names with dots that makes them unsuitable for WPF's DataGrid control? - Stack Overflow](https://stackoverflow.com/questions/2940618/what-is-it-about-datatable-column-names-with-dots-that-makes-them-unsuitable-for --- 「DataTableを使うこと自体どうなんだ?」って話なんでしょうか? わたしはその辺わかりません^^; かずきさんは5年前にこうおっしゃっていますが、今も同意見かはわかりません。 [DataTable の バインディングでの更新方法](https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/8615aae9-f1e8-4429-b838-ff11983d47ff/datatable-12398#1ac68bf3-722c-419f-9c14-ce38182a7563
noppa

2021/12/24 01:16

TN8001様 ご回答頂きありがとうございます。 >一部だけ出したいということであれば、今と同じようにDataGridTextColumn等を作るだけですよ? > >Binding="{Binding カラム名}" とDataTableのカラム名で指定もできますし、 >Binding="{Binding [0]}" とインデクサでもいいです。 思いつきませんでした・・・ よくよく考えてみれば、ObservableCollectionとやっている事は同じですね。 DataTable(DBのテーブル)のカラム名をバインドする事で思った通りの動作をする事ができました。 大変勉強になりました。ありがとうございました。 この内容で問題解決してしまいましたので解決方法の方にDBの更新も含めてソースコードを記載致します。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです