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

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

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

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

C#

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

WPF

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

Q&A

解決済

2回答

2979閲覧

【WPF】DataGridコントロールにDataTableをバインドさせてもカラム名が表示されない

ngAwf

総合スコア27

DataGrid

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

C#

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

WPF

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

0グッド

0クリップ

投稿2017/07/01 04:37

編集2017/07/02 02:56

##前提
一昨日にも似たような質問をさせて頂きました。
その際、頂いた回答を試したところ上手くいった部分と上手くいかない部分があったので再度質問をさせて頂きます。

###やりたい事
WPFでMVVMに則って、動的にDataGridへのバインドを行おうとしています。
データベースへSelectを行って取得した結果を何の加工もせずにDataGridへバインドがしたいです。

##困っている事
DataGridのItemsSourceプロパティにDataTable型の値をバインドした所、カラム名が表示されません。

##Code
DBからのデータ取得は以下のメソッドで取得しています。
このメソッド内のTableをそのままDataGridのItemsSourceへバインドしています。

C#

1public async Task GetDataTableAsync(string tableName) 2{ 3 using (var cn = new SqlConnection(_connection.ConnectionString)) 4 using (var cm = new SqlCommand("SELECT * FROM " + tableName, cn)) 5 { 6 await cn.OpenAsync(); 7 using (IDataReader reader = await cm.ExecuteReaderAsync()) 8 { 9 Table.BeginLoadData(); 10 Table.Clear(); 11 Table.Load(reader); 12 Table.EndLoadData(); 13 } 14 } 15} 16

ちなみに、このメソッド実行時にTwoColumnsテーブルを取得した時の結果は以下の様になっています。
イメージ説明

##画面イメージ
実行時の画面は以下の様になります。
イメージ説明

上記のメソッドを実行する前に、TwoColumnsテーブルが持っている列名を自前で「ID」と「FullName」という列を追加してもう一度実行してみます。
そうすると、以下の様にバインドされる事が確認できました。しかし、持っている列はテーブル毎にそれぞれ違うので、固定した列を自分で追加したくありません。

C#

1Table.Columns.Add("ID"); 2Table.Columns.Add("FullName");

イメージ説明

##他にも試した事
DataGridの AutoGenerateColumnsプロパティを"True"にしてみましたが、DataTableのカラム名を自動的にはセットしてくれませんでした。

##GitHub
以下にアップロードいたしましたので、どこが悪いのか指摘をお願い致します。
https://github.com/karimatan1106/MVVMDataGridBind

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

新しいDataTableのインスタンス生成して、更新の通知を上げないとダメだと思います。
細かいツッコミは別にしてとりあえず以下で動作するはずです

  • MainWindowViewModel.cs

C#

1 public class MainWindowViewModel : BindableBase 2 { 3 #region プロパティ 4 public ObservableCollection<string> Collection { get; set; } 5 public ObservableCollection<string> NameList { get; set; } 6 7 //※ 8 DataTable _Table; 9 public DataTable Table 10 { 11 get 12 { 13 return _Table; 14 } 15 set 16 { 17 if (_Table == value) 18 return; 19 _Table = value; 20 RaisePropertyChanged(); 21 } 22 } 23 24 25 26 27 28 private async void GetTableNameListBySelectedDBAsync(string selectedName) 29 { 30 if (_displayType == DisplayType.DBNameList 31 || _displayType == DisplayType.None) 32 { 33 await _connection.GetTableNameListAsync(selectedName); 34 } 35 else if (_displayType == DisplayType.TableNameList) 36 { 37 await _connection.GetDataTableAsync(selectedName); 38 } 39 // ※ 40 // var hoge = Table; 41 this.Table = _connection.Table; 42 43 _displayType = DisplayType.TableNameList; 44 }
  • SQLServerConnection

C#

1 public async Task GetDataTableAsync(string tableName) 2 { 3 using (var cn = new SqlConnection(_connection.ConnectionString)) 4 using (var cm = new SqlCommand("SELECT * FROM " + tableName, cn)) 5 { 6 await cn.OpenAsync(); 7 8 var sad = new SqlDataAdapter(cm); 9 var t = new DataTable(tableName); 10 11 sad.Fill(t); 12 this.Table = t; 13 14 //using (IDataReader reader = await cm.ExecuteReaderAsync()) 15 //{ 16 // Table.BeginLoadData(); 17 // Table.Clear(); 18 // Table.Load(reader); 19 // Table.EndLoadData(); 20 //} 21 } 22 }

投稿2017/07/03 03:41

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

public DataTable Table { get; set; }

DataTable _Table public DataTable Table { get{return _Table;} set{ _table=value; RaisePropertyChanged(nameof(Table)) } }

みたいにして、変更を送るようにして、
View側もTwoWayにして、Tableオブジェクトも使いまわさないという方針にしてもだめかな?

バインド後のカラムの変更を検知して表示を変えるほどDataGridは賢くはないはず。

投稿2017/07/02 08:17

編集2017/07/02 08:26
kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngAwf

2017/07/02 09:25

回答ありがとうございます。 上記のように書き換えてみましたがうまくいかないです。 試しにReactiveProperty<DataTable>に変換してみましたが、動作には変わりなかったです。 DataTableをバインドする以外の方法などはないのでしょうか。
kiichi54321

2017/07/02 15:33

一応、確認ですけど、 Table = (新しくDBからとってきたnewをしたDataTable)とやっています?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問