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

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

ただいまの
回答率

90.53%

  • C#

    7076questions

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

データベースの値をDataGridView に表示する方法について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 290

sinzanmon15

score 6

 前提・実現したいこと

練習で住所録を作成中です。
初心者で伝え方もつたなくて申し訳ないのですが
・Windows Formsで作成してます。
・開発環境:Windows7、Visual Studio2007

ACCESSのデータベースからデータを取得は出来てるんですが、
それを「list」を使用して「Form1」に設置した「登録情報一覧ボタン」で同じ「Rorm1」に設置したDataGridViewににまず一覧として表示したいのですがどうもうまくいかない状態で困ってます。

//form.1(親画面)

 private void btnInputList_Click(object sender, EventArgs e)
        {
            ////削除ボタンが機能しているか確認するためのコード(2018/07/17)
            //dgvAddressList.Rows.Add();
            OleDbConnection dbConnect = new OleDbConnection();
            CommonSQL.GetdgvData(dbConnect);//commonSQLから呼び出している(他のボタンでも使用するため関数に)



            //DataGridViewにデータを表示する

        }
//クラスを作成

public  partial class CommonSQL
    {
     public AddressDataList DataClass { get; set; }  //追加

        //リストで作成(20180723)
        public static List<AddressDataList>GetdgvData(OleDbConnection dbConnect)
        {
          
            List<AddressDataList> listData = new List<AddressDataList>();  //追加

            OleDbDataAdapter da = new OleDbDataAdapter();

            //DB接続
            string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;
                                     Data Source=..\..\DataList.mdb";
            try
            {
                //コネクション作成
                dbConnect = new OleDbConnection(connectString);

                //コネクションを開く
                dbConnect.Open();

                //変数にDBの内容を全て入れる。(テーブル名が今回は登録者情報)
                string queryString = "SELECT * FROM 登録者情報";//SQL文
                OleDbCommand command = new OleDbCommand(queryString, dbConnect);

                var dataReader = command.ExecuteReader();

                //データは格納している(table.load) 
                var table = new DataTable();
                table.Load(dataReader);


                for (int i = 0; i < table.Rows.Count; i++)   //追加
                {
                    AddressDataList data = new AddressDataList();
                    data.Number = table.Rows[i]["登録番号"].ToString();
                    data.FamilyName = table.Rows[i]["姓"].ToString();
                    data.Name = table.Rows[i]["名"].ToString();
                    data.FamilyNameKana = table.Rows[i]["姓カナ"].ToString();
                    data.NameKana = table.Rows[i]["名カナ"].ToString();
                    data.Keisyo = table.Rows[i]["敬称"].ToString();
                    data.dtpBirthday = table.Rows[i]["生年月日"].ToString();
                    data.PostalCode1 = table.Rows[i]["郵便番号"].ToString();
                    data.sex = int.Parse(table.Rows[i]["性別"].ToString());
                    data.Address1 = table.Rows[i]["住所1"].ToString();
                    data.Address2 = table.Rows[i]["住所2"].ToString();
                    data.Phone = table.Rows[i]["電話"].ToString();
                    data.MobilePhone = table.Rows[i]["携帯電話"].ToString();
                    data.EMail1 = table.Rows[i]["メールアドレス"].ToString();
                    data.URL = table.Rows[i]["URL"].ToString();
                    data.ImgName = table.Rows[i]["画像ファイル名"].ToString();
                    data.Remarks = table.Rows[i]["備考"].ToString();
                    //メール送信
                    data.MailSending =int.Parse(table.Rows[i]["メール送信"].ToString());
                    //印刷
                    data.Print = int.Parse(table.Rows[i]["印刷"].ToString());
                    listData.Add(data);
                }
                //コネクションを閉じる
                dbConnect.Close();
         return listData;   //追加
            }
            catch (Exception e)
            {
                //とりあえず、メッセージボックスで情報表示
                MessageBox.Show("Error:" + e.Message);
                return null;
            }
            return null ;//何を返すか考える

        }

どこをどうコードを組み立てればよろしいでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • sinzanmon15

    2018/07/23 17:04

    ご指導ありがとうございます。変更したのですが大丈夫でしょうか?

    キャンセル

  • SurferOnWww

    2018/07/23 17:15 編集

    表題の「データグリッド」は DataGridView の間違いですよね。訂正しておいてください。あと、カタカナでコントロールの名前を書くのは止めた方が良いです。データグリッドもデータグリッドビューも存在しません。正しくは DataGrid, DataGridView です。

    キャンセル

  • sinzanmon15

    2018/07/23 17:24

    ご指導ありがとうございます。ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

+2

コードを拝見しましたが、かなり問題ありで、それを直して何とかするというのはお勧めできないです。

大幅に書き直しませんか?

一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

そのままでは質問者さんの目的に合わない部分があるかもしれませんが、とりあえず作ってみて、ウィザードが自動生成するコードを見れば今後の開発の参考になると思います。

以下のチュートリアルは DB が SQL Server の場合ですが、Access でもほぼ同様に可能です。

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

上記チュートリアルのように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/23 17:29

    ご回答ありがとうございます。
    問題点が多すぎて直すより作り直す方がいいんですね。

    ご教示いただいたものを使用して一度作り直してみます。
    何から何までご丁寧にありがとうございます。

    キャンセル

  • 2018/07/25 09:29

    SurferOnWwwさん
    先日はご回答ありがとうございました。
    せっかく教えて頂いた方法は今後の参考にさせて頂いてます。

    まことに恐れ入りますが、記載させていただいてるコードでDataGridView に反映する方法もご教示願いないでしょか?

    課題で作っているものなんですが、
    ここからでも作成出来るからやってみてくださいと言われたので…申し訳ありませんがよろしくお願いいたします。

    ----上記のコード------------------------------------------
         var table = new DataTable();
    table.Load(dataReader);
    ----追加コード---------------------------------------------
    for (int i = 0; i < table.Rows.Count; i++)
    {
    AddressDataList data = new AddressDataList();
    data.FamilyName = table.Rows[i]["姓"].ToString();
    listData.Add(data);

    }

    ---------------------------------------------------------------------------

    こんな感じで作れるみたいなのですが
    listDataを宣言していないので存在しないとエラーがでているのと

    関数の戻り値である「List<AddressDataList>」型のデータを返すようにしましょう。
    とアドバイスがあり。

    retrunで「listData」を返せばいいのでしょうか?

    キャンセル

  • 2018/07/25 10:13 編集

    質問のコードの var table = new DataTable(); で作った DataTable に DB からデータを取得できていれば、DataGridView.DataSource プロパティに BindingSource を介して table を設定すれば表示されます。コード例は以下の記事を見て下さい。

    DataGridView.DataSource プロパティ
    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.datasource(v=vs.110).aspx

    ただ、質問者さんの場合、コードを拝見する限り、DataTable にデータを取得するところまで行ってません。それどこるか、見当違いの方向に進んでいます。なのでウィザードを使って全面的に書き直すようお勧めしたのですが・・・

    キャンセル

  • 2018/07/26 09:16

    ご回答ありがとうございます。
    追加コードを更新しております。

    何とか追加コードで、DataGridViewにDBからデータを取得出来たました。

    SurferOnWwwがおしゃってたDataTableに取得するところまでいってなかったみたいです。
    取れたのはいいんですが、先輩の指導のもとこれで作れるか不安でしかないのですが、、、
    自主勉強でウィザードを使って書き直すこともしてみます。

    色々ありがとうございます。

    キャンセル

  • 2018/07/26 11:14

    > 先輩の指導のもとこれで作れるか不安でしかないのですが、、、

    それなら、ここのような Q&A サイトで聞かないで、最初から先輩に聞いてくださいよ。

    今回のケースで、質問者さんは DB ⇒ DataReader ⇒ DataTable ⇒ List<T> 型オブジェクト ⇒ DataGridView としていますが、それは普通に考えたら有り得ないぐらいに無駄なので、私は無駄のない定番のやり方を紹介しました。

    先輩としては、何か特別な理由・事情があって、DB ⇒ DataReader ⇒ DataTable ⇒ List<T> 型オブジェクト ⇒ DataGridView とするように質問者さんを指導したのかもしれませんが、そんなことは第三者には分かりません。

    ここに書いてあること以外は知る由もない第三者に、先輩&質問者さんの理由・事情などを勘案して、それに沿った回答を期待するなら、最初から質問にその理由・事情を書いてその旨希望を述べてください。

    それができなければ、第三者しかいない Q&A サイトで聞かないで、最初から先輩に聞いてください。でないと、お互い時間と労力が無駄になると思います。

    キャンセル

  • 2018/07/26 11:23 編集

    ついでに、上で「普通に考えたら有り得ないぐらいに無駄」と書いた理由を書いておきます。

    私が紹介した記事では、 DB ⇒ DataAdapter ⇒ DataTable ⇒ DataGridView となっています。

    そうすると、以下の記事の「非接続型データアクセスの動作とそのアドバンテージ」に書いてあるように、DataAdapter, DataTable に備わっている更新機能が利用できるからです。

    図 1、図 2 を見てもらえると一目で分かる思いますので、見てください。

    DB 設計者のための明解 ADO.NET 第 1 回
    https://msdn.microsoft.com/ja-jp/library/cc482903.aspx

    先輩が指導したような、DataReader, DataTable, List<T> 型オブジェクトを DB と DataGridView の間に使って、上の記事の図 1、図 2 と同様なことができるのですか?

    そのあたり先輩に聞いてみては?

    キャンセル

  • 2018/07/26 13:13

    SurferOnWwwさん誠に申し訳ございません。
    最初に質問の内容に理由や事情を書かずに聞きたい事だけを聞く形になってしまいすみませんでした。

    ご丁寧に教えて頂いたにもかかわらず失礼なことばかりで、、、
    その上、紹介して頂いた記事の詳細までありがとうございます。

    先輩に聞いてみます。
    何から何までご丁寧にありがとうございました。

    キャンセル

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

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

関連した質問

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

  • C#

    7076questions

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