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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1096閲覧

DataGridViewへの表示

maam

総合スコア55

C#

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/12/13 02:23

SQLServer上に登録している生徒情報の、検索結果をDataGridViewへ表示するコードを作成しています。

List<string> detail = new List<string>(); ※SQL文は省略させていただきます。 // SQLを実行し、detailに格納する using (var reader = command.ExecuteReader()) { while (reader.Read() == true) { detail.Add( (reader["id"]) + "," + (reader["name1"] as string) + " " + (reader["name2"] as string) + "," +    (Convert.ToInt32(reader["gender"]) == 1 ? "男性" : "女性" )+ "," + (reader["adress"] as string) ); }   } //データを確認する foreach (string dt in detail) {   //カンマ区切りで値を取得 string[] col = dt.Split(','); dataGridView1.Rows.Add(col[0], col[1], col[2], col[3], col[4], col[5]); }

foreach以下でもう一度ループを回してdetailのデータを格納しているのですが、foreachを省略してカンマ区切りでDataGridViewに表示する方法があれば教えていただきたいです。

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

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

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

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

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

Orlofsky

2018/12/13 02:33

[SQL Server]タグを追加されては?
Zuishin

2018/12/13 21:06

実用ではないと思うんですが、何の学習なんですかこれ? データベースの使い方の学習だとしたら無茶苦茶ですが。 指導している人はプログラミング経験者でしょうか?
guest

回答2

0

ベストアンサー

質問者さんの前のスレッド

https://teratail.com/questions/162229

で「List<T> 型を使いましょう」と提案させていただいて、その案に納得されたと思っていたんですが・・・

理解できていなかったのでしょうか? それとも List<T> を使う案ではやりたいことができないとか?

【追伸】

ホントは、質問者さんが先輩に聞くべき話だとは思いますが・・・

foreachを省略してカンマ区切りでDataGridViewに表示する方法があれば教えていただきたいです。

そういう方法はなさそうです。少なくとも自分は知りません。

なので、質問者さんの前のスレッドで私が提案した List<T> 案を使って、foreach を使わないで済む方法を書いておきます。この案が質問者さんの目的に合わないなら、どこかどう合わないのか具体的に書いてください。

データベースには Microsoft が提供するサンプルデータベース Northwind の Employees テーブルを使ってみます。以下のような構造で、質問者さんの使っているものに近いのでは?

イメージ説明

コードは以下のようになります。以下のコードの Employee クラスが List<T> の T になります。SQL Server からデータを取得して、それから List<Employee> オブジェクトを作成し、DataGridView に BindingSource 経由でバインドしています。foreach は書く必要はありません。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace WindowsFormsApplication1 { public partial class Form7 : Form { private DataGridView dataGridView1; private BindingSource bindingSource1; public Form7() { InitializeComponent(); this.dataGridView1 = new DataGridView(); this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.bindingSource1 = new BindingSource(); this.dataGridView1.DataSource = this.bindingSource1; this.Controls.Add(this.dataGridView1); this.bindingSource1.DataSource = GetEmployeeList(); } private List<Employee> GetEmployeeList() { string connString = @"Data Source=(local)\sqlexpress;Initial Catalog=NORTHWIND;Integrated Security=True"; string query = "SELECT [EmployeeID],[LastName],[FirstName],[Address] FROM [Employees]"; List<Employee> list = new List<Employee>(); using (SqlConnection connection = new SqlConnection(connString)) { using (SqlCommand command = new SqlCommand(query, connection)) { connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while(reader.Read()) { Employee emp = new Employee { Id = reader.GetInt32(0), Name = reader.GetString(2) + " " + reader.GetString(1), Address = reader.GetString(3) }; list.Add(emp); } } } } return list; } } public class Employee { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } } }

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

イメージ説明

ところで、

「DataSet / DataTable + TableAdapter を作り、それを BindingSource 経由で DataGridView にバインドするのが定番の方法」とありましたが、チュートリアルを見ても理解することが難しかったので活用できませんでした、

とのことですが、一行もコードを書かずに済むので難しなんてことはあり得ません。そちらもやってみてください。やる気の問題かと思います。

投稿2018/12/13 03:17

編集2018/12/13 09:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

maam

2018/12/13 04:16

SurferOnWwwさん 前回はご丁寧にアドバイスをくださり、ありがとうございます。 その後先輩と進めていくと上記のようになり、システムとしては動いたのでforeachを省略してみようと言われたのでList<T>を使用しませんでした…。 「DataSet / DataTable + TableAdapter を作り、それを BindingSource 経由で DataGridView にバインドするのが定番の方法」とありましたが、チュートリアルを見ても理解することが難しかったので活用できませんでした、すみません…。
退会済みユーザー

退会済みユーザー

2018/12/13 05:55

> システムとしては動いたのでforeachを省略してみようと言われたのでList<T>を使用しませんでした…。 意味が分かりません。foreach を省略するなら List<T> を使うべきです。言っていることが逆では? 先輩は何を言ってるんでしょう?
退会済みユーザー

退会済みユーザー

2018/12/13 07:39

List<string> 型のオブジェクトを取得するのが目的ではないですよね? SQL Server のあるテーブルのレコード一覧を DataGridView の表示するというのが最終的な目的で、そのための手段は問わないと思っていたのですが、違うのですか? List<string> は質問者さんが考えた手段であって、他にもっといい手段があればそれにこだわらないと思っていますが、違うのでしょうか? そのあたり、具体的に説明できませんか?
退会済みユーザー

退会済みユーザー

2018/12/13 09:17

上のコメントに返事がないですが・・・ List<string> は質問者さんが考えた手段であって、他にもっといい手段があればそれにこだわらないと勝手に解釈して List<T> 案を回答欄に追記しておきます。
guest

0

dataGridView1.Rows.AddRange(col);

ってのではどうでしょう

#Bindingでどうにかできそうなきも。。

投稿2018/12/13 02:36

編集2018/12/13 02:38
y_waiwai

総合スコア87774

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

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

maam

2018/12/13 02:42

dataGridView1.Rows.AddRange(col);以降に 検索結果をどう割り当てたらよろしいでしょうか。質問ばかりですみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問