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

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

ただいまの
回答率

87.37%

DataGridView MySqlで取得したデータの表示のしかた

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,724
退会済みユーザー

退会済みユーザー

現状・実現したいこと

追記:あらかじめデザインの方で列を作成しています。
その後ろにMySqlで取得したデータが表示されている状況です。
諸事情で内容はお見せ出来ないのですが、現状は下記画像です。
現状↓↓↓
イメージ説明
実現したい事↓↓↓

番号 乗り物 アイコン
1 /image.png
2 /image.png
3 汽車 /image.png

該当のソースコード

追記:data1、data2、data3はMySqlで取得したデータ名称です。

Dim dt As DataTable = New DataTable()
builder = New MySqlConnection
builder .ConnectionString = "Database=aa;Data Source=localhost;User Id=bb;Password=****"
'接続情報を使ってコネクションを生成します。
Using conn As New MySqlConnection(builder.ConnectionString)
   'MySQL文とコネクションを設定します。
    Using cmd As New MySqlCommand("SELECT data1,data2,data3 FROM tbl_master" conn)
       'MySQLへの橋渡しのアダプターを設定します。
        Dim sda As MySqlDataAdapter = New MySqlDataAdapter()
        'SELECTコマンドを設定します。
        sda.SelectCommand = cmd
        'SELECTの実行及びフェッチ
         sda.Fill(dt)
         'グリッドに表示します。
         DataGridView1.DataSource = dt
     End Using
End Using

補足情報(FW/ツールのバージョンなど)

.Net 2010
Framework 4

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shinami

    2020/03/19 10:32

    > 追記:デザインの方で直接列を編集している形です。

    スクリーンショットは、質問内容を書く欄の上部に画像の挿入アイコンがあります
    ![ここは題名何でも良い](ここは選んだ画像のPathが入ります)

    Windows Formsのデザイナーに貼り付けたDataGridViewのプロパティをデザイナレベルで列を追加し
    列名を付けた上でそのコードを実行した結果質問欄にあるような(現状の方)になったということですか?
    いずれにしても私の想像でしかないので私はこれにて。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/03/19 10:32

    返信が遅くなりすみません。
    昨日は、体調を崩してしまいお待たせすることになってしまいました。
    本当に申し訳ございませんでした。

    キャンセル

  • SurferOnWww

    2020/03/19 10:56

    > 追記:あらかじめデザインの方で列を作成しています。

    画像を貼っていただいたのですが、依然として何をしたのか具体的なことが分かりません。らちがあきそうもないので、想像をふくらませて回答欄に追記します。

    キャンセル

回答 2

checkベストアンサー

+1

自分で設定した列の名称の下に、データを表示したいということです。

追記:「自分で設定した列」というのは、DataTable に番号、乗り物、アイコンという列名で列を作ったと理解してレスします。理解が違っていたら、どう違うのか書いてください。

クエリは以下のようになっているので、data1, data2, data3 で新たに DataTable に列が作られていて、それが DataGridView にバインドされた結果、質問の最初の画像のように表示されたということだと思います。

SELECT data1,data2,data3 FROM tbl_master

クエリを以下のように変更してみたらどうなりますか?

SELECT data1 AS 番号,data2 AS 乗り物,data3 AS アイコン FROM tbl_master

【追記2】

上のレスのやり方で期待通りの結果になることは確認しました。

検証に使ったコードと結果の画像をアップしておきます。

using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace WindowsFormsMySQL
{
    public partial class Form1 : Form
    {
        protected DataGridView dataGridView1;
        protected BindingSource bindingSource1;

        public Form1()
        {
            InitializeComponent();

            this.dataGridView1 = new DataGridView();
            this.dataGridView1.Dock = DockStyle.Fill;
            this.bindingSource1 = new BindingSource();
            this.dataGridView1.DataSource = this.bindingSource1;
            this.Controls.Add(this.dataGridView1);
            this.bindingSource1.DataSource = CreateDataTable();
        }

        private DataTable CreateDataTable()
        {
            DataTable table = new DataTable();

            table.Columns.Add(new DataColumn("番号", typeof(int)));
            table.Columns.Add(new DataColumn("名前", typeof(string)));
            table.Columns.Add(new DataColumn("数量", typeof(int)));
            table.Columns.Add(new DataColumn("単価", typeof(decimal)));
            table.Columns.Add(new DataColumn("合価", typeof(decimal)));

            string connString = "server=localhost;user id=root;password=********;database=test";
            string query = "SELECT Id AS 番号, Name AS 名前, Qty AS 数量, UnitPrice AS 単価, Qty * UnitPrice AS 合価 FROM list";
            using (MySqlConnection connection = new MySqlConnection(connString))
            {
                using (MySqlCommand command = new MySqlCommand(query, connection))
                {
                    MySqlDataAdapter adapter = new MySqlDataAdapter(command);
                    adapter.Fill(table);
                }
            }
            return table;
        } 
    }
}

イメージ説明

ただ、こういうやり方より、データーソース構成ウイザードを使って作成することをお勧めします。今回のようなことで悩むことはなくなります。開発工数も保守工数も激減するはずです。

【追記3】

質問に対する 2020/03/19 10:56 の私のコメントで、

画像を貼っていただいたのですが、依然として何をしたのか具体的なことが分かりません。らちがあきそうもないので、想像をふくらませて回答欄に追記します。

と書きましたが、それを以下に書きます。

質問者さんが言う「あらかじめデザインの方で列を作成」というのは、Form にツールボックスから DataGridView をドラッグ&ドロップして、以下の画像のようにデザイン画面で[列の追加]を行っただけで、DataPropertyName の設定はしてないのでは?

イメージ説明

DataPropertyName の設定をしてないので、DataGridView に DataTable をバインドした際、上の操作で追加した列の右に DataTable の列が新たに追加されるという結果になったと思います。

解決策は[列の編集]画面で、DataPropertyName を設定することです。例えば、SELECT クエリが SELECT Id, Name, Qty, UnitPrice, Qty * UnitPrice AS Amount FROM list となっている場合、以下の画像のよう「番号」列には Id を設定します。

イメージ説明

そうすれば、以下のコードで、

using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace WindowsFormsMySQL
{
    public partial class Form3 : Form
    {
        protected BindingSource bindingSource1;

        public Form3()
        {
            InitializeComponent();

            this.bindingSource1 = new BindingSource();
            this.dataGridView1.DataSource = this.bindingSource1;
            this.Controls.Add(this.dataGridView1);
            this.bindingSource1.DataSource = CreateDataTable();
        }

        private DataTable CreateDataTable()
        {
            DataTable table = new DataTable();

            string connString = "server=localhost;user id=root;password=*****;database=test";
            string query = "SELECT Id, Name, Qty, UnitPrice, Qty * UnitPrice AS Amount FROM list";
            using (MySqlConnection connection = new MySqlConnection(connString))
            {
                using (MySqlCommand command = new MySqlCommand(query, connection))
                {
                    MySqlDataAdapter adapter = new MySqlDataAdapter(command);
                    adapter.Fill(table);
                }
            }
            return table;
        }
    }
}

結果は以下のようになります。

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/18 11:01

    上にも書きましたが、データーソース構成ウイザードを使って作成することをお勧めします。ウィザードを使えば今回のようなことで悩むことはなくなります。自力では一行もコードを書かなくても、表示だけでなく追加・削除・更新機能を持ったアプリが作れます。開発工数も保守工数も激減するはずです。

    自己流では茨の道を歩いているようなもので、ゴールにたどり着くのに時間がかかるばかりです。

    キャンセル

  • 2020/03/19 10:33

    データソース構成ウィザードが何なのか分からないので、調査してみます。

    キャンセル

  • 2020/03/19 11:25

    本当に何度も何度もありがとうございました。
    SurferOnWwwさんがおっしゃる通りDataPropertyNameの設定をしていませんでした。
    設定したところ解決いたしました。ありがとうございました。

    キャンセル

0

  1. DataGridViewコントロールを右クリック
  2. メニューから列の編集をクリック
  3. 選択されたカラムリストからdata1カラムをクリック
  4. プロパティのHeaderTextを番号に変更
  5. data2,data3も同様に行う
  6. 任意で追加したカラムは削除する
    でどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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