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

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

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

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

Q&A

解決済

1回答

5136閲覧

List<List<string>>をDataGridViewに表示したい

YU-N

総合スコア4

C#

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

0グッド

0クリップ

投稿2022/06/19 06:49

2次元配列の文字列を、DataGridViewに表示したいのですが
Datatableなど他の型を使わず、List型から表示する方法はありますでしょうか。

VisualStudio2022
.NETFramework4.7.2
Windows Form

C#

1 var list = new List<List<string>>(); 2 3 var source1 = new List<string> { "みかん", "1個", "和歌山産" }; 4 var source2 = new List<string> { "りんご", "5個", "青森産" }; 5 var source3 = new List<string> { "もも", "7個", "山梨産" }; 6 7 list.Add(source1); 8 list.Add(source2); 9 list.Add(source3); 10 11 12 this.DataGridView1.DataSource = list;

イメージ説明

リストの中身はString[]でも良いのですが、やはりうまくいきません。

C#

1 var list = new List<string[]>(); 2 3 var source1 = new string[] { "みかん", "1個", "和歌山産" }; 4 var source2 = new string[] { "りんご", "5個", "青森産" }; 5 var source3 = new string[] { "もも", "7個", "山梨産" }; 6 7 list.Add(source1); 8 list.Add(source1); 9 list.Add(source1); 10 11 this.materialGridView.DataSource = list;

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/19 07:00

Form2 の画像が 2 つありますが、其の上のコードの実行結果がそうなるということですか? そうは見えないのですが・・・ 説明してください。 そういうのは無視してよくて、要するに以下のように表示できればいいのですか? 品名  数量  産地 みかん 1個 和歌山産 りんご 5個 青森産
YU-N

2022/06/19 07:42

コードの下に貼っていある画像がそれぞれのコードの実行結果になります。 おっしゃる通りの結果を求めています。 品名  数量  産地 みかん 1個 和歌山産 りんご 5個 青森産
退会済みユーザー

退会済みユーザー

2022/06/19 07:44

やってみました。確かに画像の通りになりますね。失礼しました。カスタムクラスを定義して List<カスタムクラス> を使うことをお勧めします。後で回答欄にサンプルを書いておきます。
guest

回答1

0

ベストアンサー

カスタムクラスを定義して List<カスタムクラス> を使うことをお勧めします。以下にサンプルコードを載せておきます。デザイン画面で Form に DataGridView と BindingSource をドラッグ&ドロップしています。

C#

1using System; 2using System.Collections.Generic; 3using System.Windows.Forms; 4 5namespace WindowsFormsApp1 6{ 7 public partial class Form5 : Form 8 { 9 public Form5() 10 { 11 InitializeComponent(); 12 13 this.dataGridView1.DataSource = this.bindingSource1; 14 } 15 16 private void Form5_Load(object sender, EventArgs e) 17 { 18 // list と list2 は質問にあったものと同じ。結果も質問者さんが貼った画像の通り 19 var list = new List<List<string>> 20 { 21 new List<string> { "みかん", "1個", "和歌山産" }, 22 new List<string> { "りんご", "5個", "青森産" }, 23 new List<string> { "もも", "7個", "山梨産" } 24 }; 25 26 var list2 = new List<string[]> 27 { 28 new string[] { "みかん", "1個", "和歌山産" }, 29 new string[] { "りんご", "5個", "青森産" }, 30 new string[] { "もも", "7個", "山梨産" } 31 }; 32 33 // これを使ってください 34 var list3 = new List<Product> 35 { 36 new Product { 品名="みかん", 数量="1個", 産地="和歌山産" }, 37 new Product { 品名="りんご", 数量="5個", 産地="青森産" }, 38 new Product { 品名="もも", 数量="7個", 産地="山梨産" } 39 }; 40 41 this.bindingSource1.DataSource = list3; 42 } 43 } 44 45 public class Product 46 { 47 public string 品名 { get; set; } 48 public string 数量 { get; set; } 49 public string 産地 { get; set; } 50 } 51}

list と list2 は質問にあったものと同じで結果も質問者さんが貼った画像の通りとなります。

list3 が Product カスタムクラスを定義して List<Product> を作ってそれをデータバインドしたものです。

基本的に、上のコードのように、

DataGridView ⇔ BindingSource ⇔ List<T> または DataTable

という構成にすることをお勧めします。

実行結果は以下の通りとなります。

イメージ説明

投稿2022/06/19 08:00

編集2022/06/19 08:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/06/19 08:20

List<T> の T のプロパティを列として表示することになります。Product クラスには「品名」「数量」「産地」というプロパティが定義してあるのでそれが列として表示されています。 一方、質問者さんの List<List<string>> の場合、List<string> には Capacity と Count が List<T> クラスのライブラリに定義されているのでそれを列として表示したということのようです。
YU-N

2022/06/19 08:26

早速の回答ありがとうございます! カスタムクラスを定義してみます!! >基本的に、上のコードのように、 >DataGridView ⇔ BindingSource ⇔ List<T> または DataTable >という構成にすることをお勧めします。 Datatableを使用した場合(カスタムクラスも?) (Datatable dtを作っていたとして) DataGridView.DataSource = dt という形で実行してあげると、DataGridViewに表示されるかと思いますが BindingSourceを挟む理由をご教示頂けないでしょうか。 それとも、上記のようにDataSourceにデータテーブルを設定しても、内部的にはBindingされているということでしょうか?
退会済みユーザー

退会済みユーザー

2022/06/19 09:34

> BindingSourceを挟む理由をご教示頂けないでしょうか。 操作するのに便利だからです。詳しくは Microsoft のドキュメントを読んでください。 BindingSource クラス https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.bindingsource?view=netframework-4.8 表示するだけで将来的にも何の操作も行わないならなくても済みますが、自分は DataGridView ⇔ BindingSource ⇔ List<T> または DataTable というパターンはベストプラクティス的なものだと思って必ずそうしてます。
YU-N

2022/06/19 10:08

ありがとうございました! BindingSourceを極力挟むように習慣にしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問