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

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

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

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

Q&A

解決済

2回答

11966閲覧

データソースにデータを入れる方法は?

meshkit

総合スコア72

C#

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

1グッド

1クリップ

投稿2018/01/18 02:46

###前提・実現したいこと
前回の質問の続きです。
Visual Studio 2015 Pro, C#、Windows FormでDataGridViewにBindingしようとしています。
データソースを作っています。

###発生している問題・エラーメッセージ
データソースにデータを入れる方法がわかりません。
desingnerで見て
this.infoModelBindingSource = new BindingSource( models, string.Empty);
かとおもいましたが、データを表示できません。

###該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Windows.Forms; 4 5namespace WindowsFormsApplication2 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 private void Form1_Load(object sender, EventArgs e) 15 { 16 List<InfoModel> models = new List<InfoModel>(); 17 var man1 = new InfoModel { 18 Name="A", 19 Sex="M", 20 Age=19, 21 Like="BascketBall" 22 }; 23 models.Add(man1); 24 var woman1 = new InfoModel 25 { 26 Name = "B", 27 Sex = "F", 28 Age = 18, 29 Like = "Dance" 30 }; 31 models.Add(woman1); 32 this.infoModelBindingSource = new BindingSource( models, string.Empty); 33 //デザイナーでBindしたのでコメントアウト。 34 //this.dataGridView1.DataSource = new BindingSource(models, string.Empty); 35 //this.dataGridView1.Columns[2].DisplayIndex = 0; 36 //this.dataGridView1.Columns[3].DisplayIndex = 1; 37 38 } 39 } 40 public class InfoModel : BaseModel 41 { 42 public int Age { get; set; } 43 public string Like { get; set; } 44 } 45 46 public class BaseModel 47 { 48 public string Name { get; set; } 49 public string Sex { get; set; } 50 } 51}

C#

1namespace WindowsFormsApplication2 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.components = new System.ComponentModel.Container(); 32 this.dataGridView1 = new System.Windows.Forms.DataGridView(); 33 this.infoModelBindingSource = new System.Windows.Forms.BindingSource(this.components); 34 this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); 35 this.ageDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); 36 this.sexDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); 37 this.likeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); 38 ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); 39 ((System.ComponentModel.ISupportInitialize)(this.infoModelBindingSource)).BeginInit(); 40 this.SuspendLayout(); 41 // 42 // dataGridView1 43 // 44 this.dataGridView1.AutoGenerateColumns = false; 45 this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 46 this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 47 this.nameDataGridViewTextBoxColumn, 48 this.ageDataGridViewTextBoxColumn, 49 this.sexDataGridViewTextBoxColumn, 50 this.likeDataGridViewTextBoxColumn}); 51 this.dataGridView1.DataSource = this.infoModelBindingSource; 52 this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; 53 this.dataGridView1.Location = new System.Drawing.Point(0, 0); 54 this.dataGridView1.Name = "dataGridView1"; 55 this.dataGridView1.Size = new System.Drawing.Size(531, 278); 56 this.dataGridView1.TabIndex = 0; 57 // 58 // infoModelBindingSource 59 // 60 this.infoModelBindingSource.DataSource = typeof(WindowsFormsApplication2.InfoModel); 61 // 62 // nameDataGridViewTextBoxColumn 63 // 64 this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name"; 65 this.nameDataGridViewTextBoxColumn.HeaderText = "Name"; 66 this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn"; 67 // 68 // ageDataGridViewTextBoxColumn 69 // 70 this.ageDataGridViewTextBoxColumn.DataPropertyName = "Age"; 71 this.ageDataGridViewTextBoxColumn.HeaderText = "Age"; 72 this.ageDataGridViewTextBoxColumn.MaxInputLength = 100; 73 this.ageDataGridViewTextBoxColumn.Name = "ageDataGridViewTextBoxColumn"; 74 // 75 // sexDataGridViewTextBoxColumn 76 // 77 this.sexDataGridViewTextBoxColumn.DataPropertyName = "Sex"; 78 this.sexDataGridViewTextBoxColumn.HeaderText = "Sex"; 79 this.sexDataGridViewTextBoxColumn.Name = "sexDataGridViewTextBoxColumn"; 80 // 81 // likeDataGridViewTextBoxColumn 82 // 83 this.likeDataGridViewTextBoxColumn.DataPropertyName = "Like"; 84 this.likeDataGridViewTextBoxColumn.HeaderText = "Like"; 85 this.likeDataGridViewTextBoxColumn.Name = "likeDataGridViewTextBoxColumn"; 86 // 87 // Form1 88 // 89 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 90 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 91 this.ClientSize = new System.Drawing.Size(531, 278); 92 this.Controls.Add(this.dataGridView1); 93 this.Name = "Form1"; 94 this.Text = "Form1"; 95 this.Load += new System.EventHandler(this.Form1_Load); 96 ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); 97 ((System.ComponentModel.ISupportInitialize)(this.infoModelBindingSource)).EndInit(); 98 this.ResumeLayout(false); 99 100 } 101 102 #endregion 103 104 private System.Windows.Forms.DataGridView dataGridView1; 105 private System.Windows.Forms.BindingSource infoModelBindingSource; 106 private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn; 107 private System.Windows.Forms.DataGridViewTextBoxColumn ageDataGridViewTextBoxColumn; 108 private System.Windows.Forms.DataGridViewTextBoxColumn sexDataGridViewTextBoxColumn; 109 private System.Windows.Forms.DataGridViewTextBoxColumn likeDataGridViewTextBoxColumn; 110 } 111} 112
bochan2👍を押しています

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

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

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

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

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

guest

回答2

0

直接の回答ではないです。なので質問者さんが求めている回答とは違うかもしれませんが・・・

今はデータソースは List<InfoModel> を自力でコーディングして作ってそれをバインドしているようですが、最終的には SQL Server などのデータベースのテーブルを DataGridView に表示し、それを編集して更新するということがしたいのでは?

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

今はデータベースは使ってなければ、たぶん Visual Studio をインストールするときに同時にインストールされたであろう LocalDB か、無償の SQL Server Express を使ってとりあえず作ってみて、ウィザードが自動生成するコードを見れば今後の開発の参考になると思います。

データベースがが SQL Server の場合ですが、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
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/01/19 11:06 の私のコメントで「コード例を回答欄にアップしておきます」と書きましたが、それを以下に追記しておきす。

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; using System.Security.Principal; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private DataGridView dataGridView1 = new DataGridView(); private BindingSource bindingSource1 = new BindingSource(); List<Data> list = new List<Data> { new Data() { 文字 = "AAA", 数字 = 1 }, new Data() { 文字 = "BBB", 数字 = 2 }, new Data() { 文字 = "CCC", 数字 = 3 } }; public Form1() { InitializeComponent(); this.Controls.Add(dataGridView1); bindingSource1.DataSource = list; dataGridView1.DataSource = bindingSource1; } } public class Data { public string 文字 { set; get; } public int 数字 { set; get; } } }

投稿2018/01/18 06:30

編集2018/01/19 02:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

meshkit

2018/01/19 00:36

ありがとうございます。 今回のプロジェクトでBindingする部分にはSQLは使いませんが、SQLからBindingすることは今後もありそうなので、時間のある時に見てみようと思います。 ちなみに、いまざっと見たところ、いまわたしに必要なのは、「10行でズバリ」のくらいの密度で、SQLを使わないチュートリアルの情報なのですが、そういうページはご存じありませんか? msdnは情報が細切れであちこちに分散していて、全体を把握できずにいます。 もしご存知でしたら補足していただけるとうれしいです。 自分でも探したのですが、msdnばかりヒットして、途方に暮れました。
退会済みユーザー

退会済みユーザー

2018/01/19 02:06

> 「10行でズバリ」のくらいの密度で、SQLを使わないチュートリアルの情報なのですが、そういうページはご存じありませんか? 「密度」というのは説明の詳細さという意味だと理解していますが、そうだとすると List<T> 型のオブジェクトをバインドするようなチュートリアルでそこまで詳細なものは自分は見たことがないです。 というか、そのような詳細説明は必要ないのではないかと思うのですが。 「10行でズバリ」のチュートリアルは、Visual Studio 2008 以降で使用できるようになった TableAdapterManager を利用して、SQL Server の複数のテーブルを階層更新するというものです。複雑な設定・操作が必要なのでその分詳細さが増しています。 (TableAdapterManager による「階層更新」については、自分のブログで恐縮ですが、 http://surferonwww.info/BlogEngine/post/2011/12/21/TableAdapterManager.aspx を見てください) 一方、質問者さんのコード例のように List<T> 型のデータを表示するだけなら(編集・更新までは考えてないと理解してます)、それを DataSource プロパティに設定するだけですみます。 BindingSource を使いたいということであれば、単純に間にそれを入れることで可能です。 コード例を回答欄にアップしておきます。 一度「データベースへのデータの保存 (単一テーブル)」の方のチュートリアルで作ってみて、それをどのように応用できるかを考えてみてはいかがでしょう?
meshkit

2018/01/19 05:57

ありがとうございます。 第1段階としては直近のList<T>の表示、第2段階としてはSQLと考えています。 いただいたチュートリアルだとSQLの部分を外す必要があって。 いちどに一歩しか進めないのです。 コード例、ありがとうございます。参考にします。
退会済みユーザー

退会済みユーザー

2018/01/19 07:06

> 第1段階としては直近のList<T>の表示、第2段階としてはSQLと考えています。 チュートリアルで使われている Northwind や Pubs は LocalDB でも使えます。 LocalDB で Northwind と Pubs を利用 http://surferonwww.info/BlogEngine/post/2017/05/16/use-northwind-and-pubs-on-localdb-2016.aspx 結局 SQL Server などのデータベース利用が必須になると思いますので、早くそちらの方に進んだ方がよさそうな気がします。(「第1段階」はむしろ遠回りになるかもしれません)
guest

0

ベストアンサー

DataGridView.DataSourceBindingSource を入れ、BindingSource.DataSource にデータを入れます。
前半はできていて infoModelBindingSource にもインスタンスが割り当てられているので、以下の部分は要りません。

C#

1this.infoModelBindingSource = new BindingSource( models, string.Empty);

次のように書き換えてください。

C#

1this.infoModelBindingSource.DataSource = models;

投稿2018/01/18 03:22

Zuishin

総合スコア28660

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

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

meshkit

2018/01/19 00:27

なるほど! infoModelBidingSourceという名前だったので、DataSourceかと思ったら、その下にDataSourceがあったのですね。ありがとうございました。できました。
Zuishin

2018/01/19 00:36

BindingSource は IBindingListView を実装しているコンポーネントで、これを間に挟むとデータの複数プロパティによるソートやフィルタリングができるようになります。 詳細は IBindingListView の説明を参照してください。
Zuishin

2018/01/19 00:37

単純な表示だけならこれを使わず DataGridView の DataSource に直接データを突っ込んで構いません。
meshkit

2018/01/19 00:38

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問