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

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

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

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

Q&A

解決済

1回答

14647閲覧

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

sinzanmon15

総合スコア14

C#

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

0グッド

1クリップ

投稿2018/07/23 07:36

編集2018/07/26 00:09

前提・実現したいこと

練習で住所録を作成中です。
初心者で伝え方もつたなくて申し訳ないのですが
・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 ;//何を返すか考える }

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/23 07:51

何を作っているか(Windows Forms? WPF? ASP.NET Web Forms? ASP.NET MVC? その他?)と開発環境(OS, .NET, Visual Studio のバージョンなど)ぐらいは書こうよ。
退会済みユーザー

退会済みユーザー

2018/07/23 07:53

それから、コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。
sinzanmon15

2018/07/23 08:04

ご指導ありがとうございます。変更したのですが大丈夫でしょうか?
退会済みユーザー

退会済みユーザー

2018/07/23 08:25 編集

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

2018/07/23 08:24

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

回答1

0

ベストアンサー

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

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

一度 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 08:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sinzanmon15

2018/07/23 08:29

ご回答ありがとうございます。 問題点が多すぎて直すより作り直す方がいいんですね。 ご教示いただいたものを使用して一度作り直してみます。 何から何までご丁寧にありがとうございます。
sinzanmon15

2018/07/25 00: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 01: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 にデータを取得するところまで行ってません。それどこるか、見当違いの方向に進んでいます。なのでウィザードを使って全面的に書き直すようお勧めしたのですが・・・
sinzanmon15

2018/07/26 00:16

ご回答ありがとうございます。 追加コードを更新しております。 何とか追加コードで、DataGridViewにDBからデータを取得出来たました。 SurferOnWwwがおしゃってたDataTableに取得するところまでいってなかったみたいです。 取れたのはいいんですが、先輩の指導のもとこれで作れるか不安でしかないのですが、、、 自主勉強でウィザードを使って書き直すこともしてみます。 色々ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/07/26 02:14

> 先輩の指導のもとこれで作れるか不安でしかないのですが、、、 それなら、ここのような Q&A サイトで聞かないで、最初から先輩に聞いてくださいよ。 今回のケースで、質問者さんは DB ⇒ DataReader ⇒ DataTable ⇒ List<T> 型オブジェクト ⇒ DataGridView としていますが、それは普通に考えたら有り得ないぐらいに無駄なので、私は無駄のない定番のやり方を紹介しました。 先輩としては、何か特別な理由・事情があって、DB ⇒ DataReader ⇒ DataTable ⇒ List<T> 型オブジェクト ⇒ DataGridView とするように質問者さんを指導したのかもしれませんが、そんなことは第三者には分かりません。 ここに書いてあること以外は知る由もない第三者に、先輩&質問者さんの理由・事情などを勘案して、それに沿った回答を期待するなら、最初から質問にその理由・事情を書いてその旨希望を述べてください。 それができなければ、第三者しかいない Q&A サイトで聞かないで、最初から先輩に聞いてください。でないと、お互い時間と労力が無駄になると思います。
退会済みユーザー

退会済みユーザー

2018/07/26 02:28 編集

ついでに、上で「普通に考えたら有り得ないぐらいに無駄」と書いた理由を書いておきます。 私が紹介した記事では、 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 と同様なことができるのですか? そのあたり先輩に聞いてみては?
sinzanmon15

2018/07/26 04:13

SurferOnWwwさん誠に申し訳ございません。 最初に質問の内容に理由や事情を書かずに聞きたい事だけを聞く形になってしまいすみませんでした。 ご丁寧に教えて頂いたにもかかわらず失礼なことばかりで、、、 その上、紹介して頂いた記事の詳細までありがとうございます。 先輩に聞いてみます。 何から何までご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問