teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記3

2020/03/19 02:19

投稿

退会済みユーザー
answer CHANGED
@@ -72,4 +72,69 @@
72
72
 
73
73
  ![イメージ説明](8cad60c56bf417989418fb36f8438f54.jpeg)
74
74
 
75
- ただ、こういうやり方より、データーソース構成ウイザードを使って作成することをお勧めします。今回のようなことで悩むことはなくなります。開発工数も保守工数も激減するはずです。
75
+ ただ、こういうやり方より、データーソース構成ウイザードを使って作成することをお勧めします。今回のようなことで悩むことはなくなります。開発工数も保守工数も激減するはずです。
76
+
77
+ **【追記3】**
78
+
79
+ 質問に対する 2020/03/19 10:56 の私のコメントで、
80
+
81
+ > 画像を貼っていただいたのですが、依然として何をしたのか具体的なことが分かりません。らちがあきそうもないので、想像をふくらませて回答欄に追記します。
82
+
83
+ と書きましたが、それを以下に書きます。
84
+
85
+ 質問者さんが言う「あらかじめデザインの方で列を作成」というのは、Form にツールボックスから DataGridView をドラッグ&ドロップして、以下の画像のようにデザイン画面で[列の追加]を行っただけで、DataPropertyName の設定はしてないのでは?
86
+
87
+ ![イメージ説明](52151455016dc7d6828296a9e36d09c9.jpeg)
88
+
89
+ DataPropertyName の設定をしてないので、DataGridView に DataTable をバインドした際、上の操作で追加した列の右に DataTable の列が新たに追加されるという結果になったと思います。
90
+
91
+ 解決策は[列の編集]画面で、DataPropertyName を設定することです。例えば、SELECT クエリが SELECT Id, Name, Qty, UnitPrice, Qty * UnitPrice AS Amount FROM list となっている場合、以下の画像のよう「番号」列には Id を設定します。
92
+
93
+ ![イメージ説明](57046a8cebec18a7663f5319c267bd21.jpeg)
94
+
95
+ そうすれば、以下のコードで、
96
+
97
+ ```
98
+ using System.Data;
99
+ using System.Windows.Forms;
100
+ using MySql.Data.MySqlClient;
101
+
102
+ namespace WindowsFormsMySQL
103
+ {
104
+ public partial class Form3 : Form
105
+ {
106
+ protected BindingSource bindingSource1;
107
+
108
+ public Form3()
109
+ {
110
+ InitializeComponent();
111
+
112
+ this.bindingSource1 = new BindingSource();
113
+ this.dataGridView1.DataSource = this.bindingSource1;
114
+ this.Controls.Add(this.dataGridView1);
115
+ this.bindingSource1.DataSource = CreateDataTable();
116
+ }
117
+
118
+ private DataTable CreateDataTable()
119
+ {
120
+ DataTable table = new DataTable();
121
+
122
+ string connString = "server=localhost;user id=root;password=*****;database=test";
123
+ string query = "SELECT Id, Name, Qty, UnitPrice, Qty * UnitPrice AS Amount FROM list";
124
+ using (MySqlConnection connection = new MySqlConnection(connString))
125
+ {
126
+ using (MySqlCommand command = new MySqlCommand(query, connection))
127
+ {
128
+ MySqlDataAdapter adapter = new MySqlDataAdapter(command);
129
+ adapter.Fill(table);
130
+ }
131
+ }
132
+ return table;
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ 結果は以下のようになります。
139
+
140
+ ![イメージ説明](2a3ad3e5c9b9aec25af3b0d735878c59.jpeg)

3

訂正

2020/03/19 02:19

投稿

退会済みユーザー
answer CHANGED
@@ -54,7 +54,7 @@
54
54
  table.Columns.Add(new DataColumn("単価", typeof(decimal)));
55
55
  table.Columns.Add(new DataColumn("合価", typeof(decimal)));
56
56
 
57
- string connString = "server=localhost;user id=root;password=rkt81141;database=test";
57
+ string connString = "server=localhost;user id=root;password=********;database=test";
58
58
  string query = "SELECT Id AS 番号, Name AS 名前, Qty AS 数量, UnitPrice AS 単価, Qty * UnitPrice AS 合価 FROM list";
59
59
  using (MySqlConnection connection = new MySqlConnection(connString))
60
60
  {

2

追記

2020/03/17 06:37

投稿

退会済みユーザー
answer CHANGED
@@ -12,4 +12,64 @@
12
12
 
13
13
  ```
14
14
  SELECT data1 AS 番号,data2 AS 乗り物,data3 AS アイコン FROM tbl_master
15
- ```
15
+ ```
16
+
17
+ **【追記2】**
18
+
19
+ 上のレスのやり方で期待通りの結果になることは確認しました。
20
+
21
+ 検証に使ったコードと結果の画像をアップしておきます。
22
+
23
+ ```
24
+ using System.Data;
25
+ using System.Windows.Forms;
26
+ using MySql.Data.MySqlClient;
27
+
28
+ namespace WindowsFormsMySQL
29
+ {
30
+ public partial class Form1 : Form
31
+ {
32
+ protected DataGridView dataGridView1;
33
+ protected BindingSource bindingSource1;
34
+
35
+ public Form1()
36
+ {
37
+ InitializeComponent();
38
+
39
+ this.dataGridView1 = new DataGridView();
40
+ this.dataGridView1.Dock = DockStyle.Fill;
41
+ this.bindingSource1 = new BindingSource();
42
+ this.dataGridView1.DataSource = this.bindingSource1;
43
+ this.Controls.Add(this.dataGridView1);
44
+ this.bindingSource1.DataSource = CreateDataTable();
45
+ }
46
+
47
+ private DataTable CreateDataTable()
48
+ {
49
+ DataTable table = new DataTable();
50
+
51
+ table.Columns.Add(new DataColumn("番号", typeof(int)));
52
+ table.Columns.Add(new DataColumn("名前", typeof(string)));
53
+ table.Columns.Add(new DataColumn("数量", typeof(int)));
54
+ table.Columns.Add(new DataColumn("単価", typeof(decimal)));
55
+ table.Columns.Add(new DataColumn("合価", typeof(decimal)));
56
+
57
+ string connString = "server=localhost;user id=root;password=rkt81141;database=test";
58
+ string query = "SELECT Id AS 番号, Name AS 名前, Qty AS 数量, UnitPrice AS 単価, Qty * UnitPrice AS 合価 FROM list";
59
+ using (MySqlConnection connection = new MySqlConnection(connString))
60
+ {
61
+ using (MySqlCommand command = new MySqlCommand(query, connection))
62
+ {
63
+ MySqlDataAdapter adapter = new MySqlDataAdapter(command);
64
+ adapter.Fill(table);
65
+ }
66
+ }
67
+ return table;
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ ![イメージ説明](8cad60c56bf417989418fb36f8438f54.jpeg)
74
+
75
+ ただ、こういうやり方より、データーソース構成ウイザードを使って作成することをお勧めします。今回のようなことで悩むことはなくなります。開発工数も保守工数も激減するはずです。

1

追記

2020/03/17 06:26

投稿

退会済みユーザー
answer CHANGED
@@ -1,5 +1,7 @@
1
1
  > 自分で設定した列の名称の下に、データを表示したいということです。
2
2
 
3
+ **追記**:「自分で設定した列」というのは、DataTable に番号、乗り物、アイコンという列名で列を作ったと理解してレスします。理解が違っていたら、どう違うのか書いてください。
4
+
3
5
  クエリは以下のようになっているので、data1, data2, data3 で新たに DataTable に列が作られていて、それが DataGridView にバインドされた結果、質問の最初の画像のように表示されたということだと思います。
4
6
 
5
7
  ```