C# データベースからSELECTした内容をDataGridの列に当てはめる
- 評価
- クリップ 0
- VIEW 6,063
表題の件で質問お願い致します。
WPFの画面上にあるDateGridにデータベースから取得したデータを表示させたいのですが
列数の少ないテーブルに関してはすべてのデータや一部のデータを取得させる、ということは出来ました
今回は列名には、あるテーブルのレコード分表示させたいと考えています
列数の少ないテーブルを表示させたときは手書きで
dt.Columns.Add("〇〇");
のように複数列名を書いていたのですが
今回列名に指定したいデータは90個近くあり手書きではなく、列名に指定したいデータをSELECTで取ってきて、自動で横軸に当てはめたいと考えています
DataTable tb1 = new DataTable();
var command1 = new NpgsqlCommand("select st_num from lesson1.person", conn);
var dataReader1 = command.ExecuteReader();
というコードを追加して、ほしい列名のデータはdataReader1に入れることは出来たのですが
行としては表示できても列として表示することができません
列名をデータベースから取ってきた値を当てはめる方法についてアドバイスいただきたいです
分かりにくい説明で申し訳ありません
よろしくお願いします
以下、グリッドにテーブルのデータを表示させるコードの抜粋です
これを応用できるのかなと考えました
C#
public partial class MainWindow : Window
{
public MainWindow()
{
DataTable tb = new DataTable();
//DataTableのインスタンスtbを定義
tb.Columns.Add("name");
//DataTableのインスタンスtbにnameという列を挿入
InitializeComponent();
var connString = "Server=cpedev27;Port=5432;User Id=test_user;Password=test_user;Database=test_server;";
var conn = new NpgsqlConnection(connString);
conn.Open();
var command = new NpgsqlCommand("select name from lesson2.person", conn);
var dataReader = command.ExecuteReader();
while (dataReader.Read())
{
var row = tb.NewRow();
for (int i = 0; i < dataReader.FieldCount; i++)
{
row["name"] = dataReader["name"];
// dataReader["name"]はDBからとってくるデータの為名前は欲しい列と一致させる
}
tb.Rows.Add(row);
}
```
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
DataAdapter.Fill メソッドを使ってみる
.NETライブラリ「Npgsql」によるPostgreSQLの活用
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
var dataAdapter = new NpgsqlDataAdapter(@"select * from table_name", conn);
var dataSet = new DataSet();
dataAdapter.Fill(dataSet);
}
あとはこのDataSetのTableとDataGridをデータバインドするだけで、やりたいことが実現するのでは?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/10/12 14:58
以下のように
var dataReader1 = coma.ExecuteReader();
で取得したデータをstring型の配列に入れなおし、
table.Columns.Add(a);で追加することで実現できました
バインドに関してはまだまだ理解が出来ていないので直接書く方法で行いました
DataTable table = new DataTable();
var coma = new NpgsqlCommand("select dsp_num from kado_sys.st_mstr order by dsp_num ASC;", conn);
var dataReader1 = coma.ExecuteReader();
var row = table.NewRow();
while (dataReader1.Read())
{
for (int u = 0; u<dataReader1.FieldCount; u++)
{
var a = dataReader1[u].ToString();
table.Columns.Add(a);
}
}
table.Rows.Add(row);
this.DataContext = table;
2017/10/12 17:54
気になるので、記載しておいたほうがいいかなと思います。
最初のコードの書き方だと、おそらくですが
~.xaml.cs ファイルに書かれているのかな?
MVVMじゃない。。。
(まあ私も書き方はしっかり分かっているか?
と問われると困りますが)
MVVMに関してはネットで探すぐらいしかない
(日本の書籍ではない?あったら知りたい。)
ので、MVVMは後々のためにも学んでおくべきかと思います。
2017/10/15 23:42
返信遅くなり申し訳ありません。
ご指摘の通りxaml.csに全て書いているのでWPFである意味が無い状態です…。
コードを書くという事にまだまだ慣れていないのでまずは一旦形にして、その後で分ける方法にしようかと考えています。(かなり遠回りな上に変な癖が付くかもしれないので良くないかもしれませんが…)
書籍は無いのですね。
MVVMはとても難しい印象があります…。
いくつかネットでもサイトを見つけたので今後活用していくためにも勉強させて頂きます。