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

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

ただいまの
回答率

90.50%

  • C#

    7121questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 526

meshkit

score 62

前提・実現したいこと

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

発生している問題・エラーメッセージ

データソースにデータを入れる方法がわかりません。
desingnerで見て
this.infoModelBindingSource = new BindingSource( models, string.Empty);
かとおもいましたが、データを表示できません。

該当のソースコード

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<InfoModel> models = new List<InfoModel>();
            var man1 = new InfoModel {
                Name="A",
                Sex="M",
                Age=19,
                Like="BascketBall"
            };
            models.Add(man1);
            var woman1 = new InfoModel
            {
                Name = "B",
                Sex = "F",
                Age = 18,
                Like = "Dance"
            };
            models.Add(woman1);
            this.infoModelBindingSource = new BindingSource( models, string.Empty);
            //デザイナーでBindしたのでコメントアウト。
            //this.dataGridView1.DataSource = new BindingSource(models, string.Empty);
            //this.dataGridView1.Columns[2].DisplayIndex = 0;
            //this.dataGridView1.Columns[3].DisplayIndex = 1;

        }
    }
    public class InfoModel : BaseModel
    {
        public int Age { get; set; }
        public string Like { get; set; }
    }

    public class BaseModel
    {
        public string Name { get; set; }
        public string Sex { get; set; }
    }
}
namespace WindowsFormsApplication2
{
    partial class Form1
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            this.infoModelBindingSource = new System.Windows.Forms.BindingSource(this.components);
            this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.ageDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.sexDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.likeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.infoModelBindingSource)).BeginInit();
            this.SuspendLayout();
            // 
            // dataGridView1
            // 
            this.dataGridView1.AutoGenerateColumns = false;
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.nameDataGridViewTextBoxColumn,
            this.ageDataGridViewTextBoxColumn,
            this.sexDataGridViewTextBoxColumn,
            this.likeDataGridViewTextBoxColumn});
            this.dataGridView1.DataSource = this.infoModelBindingSource;
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 0);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.Size = new System.Drawing.Size(531, 278);
            this.dataGridView1.TabIndex = 0;
            // 
            // infoModelBindingSource
            // 
            this.infoModelBindingSource.DataSource = typeof(WindowsFormsApplication2.InfoModel);
            // 
            // nameDataGridViewTextBoxColumn
            // 
            this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name";
            this.nameDataGridViewTextBoxColumn.HeaderText = "Name";
            this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn";
            // 
            // ageDataGridViewTextBoxColumn
            // 
            this.ageDataGridViewTextBoxColumn.DataPropertyName = "Age";
            this.ageDataGridViewTextBoxColumn.HeaderText = "Age";
            this.ageDataGridViewTextBoxColumn.MaxInputLength = 100;
            this.ageDataGridViewTextBoxColumn.Name = "ageDataGridViewTextBoxColumn";
            // 
            // sexDataGridViewTextBoxColumn
            // 
            this.sexDataGridViewTextBoxColumn.DataPropertyName = "Sex";
            this.sexDataGridViewTextBoxColumn.HeaderText = "Sex";
            this.sexDataGridViewTextBoxColumn.Name = "sexDataGridViewTextBoxColumn";
            // 
            // likeDataGridViewTextBoxColumn
            // 
            this.likeDataGridViewTextBoxColumn.DataPropertyName = "Like";
            this.likeDataGridViewTextBoxColumn.HeaderText = "Like";
            this.likeDataGridViewTextBoxColumn.Name = "likeDataGridViewTextBoxColumn";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(531, 278);
            this.Controls.Add(this.dataGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.infoModelBindingSource)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.DataGridView dataGridView1;
        private System.Windows.Forms.BindingSource infoModelBindingSource;
        private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn ageDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn sexDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn likeDataGridViewTextBoxColumn;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

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

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

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

this.infoModelBindingSource.DataSource = models;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/19 09:27

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

    キャンセル

  • 2018/01/19 09:36

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

    キャンセル

  • 2018/01/19 09:37

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

    キャンセル

  • 2018/01/19 09:38

    ありがとうございます!

    キャンセル

+1

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

今はデータソースは 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/19 09:36

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

    キャンセル

  • 2018/01/19 11: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 を使いたいということであれば、単純に間にそれを入れることで可能です。

    コード例を回答欄にアップしておきます。

    一度「データベースへのデータの保存 (単一テーブル)」の方のチュートリアルで作ってみて、それをどのように応用できるかを考えてみてはいかがでしょう?

    キャンセル

  • 2018/01/19 14:57

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

    キャンセル

  • 2018/01/19 16: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段階」はむしろ遠回りになるかもしれません)

    キャンセル

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

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

関連した質問

  • 解決済

    C#のDataGridView

    C#のDataGridViewはRow, Column, Cellのような構造をもっていますが、複雑でわかりにくいです。 3行目、4列目のセルの種類(buttonとかstri

  • 解決済

    VBScriptのボタン

    vbscriptをつかってシャットダウンをさせたいと思っています。 現在のソースはこちら Msg = MsgBox("シャットダウンしますか?", vbYesNo + 

  • 解決済

    ElementHost上にPictureBoxを重ねて透過させたい

    ElementHost上にPictureBoxを重ねてPictureBoxを透過させる Windows Form Applicationにおいて、ElementHostにPict

  • 解決済

    C# DatagridViewの使い方

    C# DataGridViewについて 1列目の1行目にA、2行目にB、3行目にCと表示したくて下記のようにコーディングしました。 namespace WindowsF

  • 解決済

    Datetime型のリストに入った時刻の合計の出し方

    C#、VisualStudio初心者です。 Datetime型のリストに格納された時刻をすべて足したいのですが、 Timespanとどう合わせて計算すればいいのかわかりません。

  • 解決済

    DataGridViewにおける選択行の編集方法

    前提・実現したいこと 2つのtextbox内の数値を掛け合わせた計算結果をDataGridViewに表示させていっています。 複数回その処理を実行した後、DataGridView内

  • 解決済

    DataGridViewのイベント

    Form1の画面にDataGridViewを貼りつけ、DataGridViewのカラムを3つ追加します。 カラム1のColumn TypeはDataGridView TextB

  • 解決済

    DataGridViewでの定数項目の編集時表示切替について

    前提・実現したいこと vb.netにおけるDataGridViewでの定数項目(0:なし、1:ありといった項目)について、 セル編集時には定数を表示し、編集完了後は名称で表示する動

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

  • C#

    7121questions

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