【C#入門】DataGridViewの使い方(行の追加・削除、ソートも解説)

こんにちは!フリーランスの長野です。

DataGridViewって使ってますか?DataGridVIewはGUIで表データを表示する場合に使うコントロールです。

WindowsフォームでDataGridViewを使うことができます。ちなみにWindowsフォームとはC言語などで使われるWin32 APIを継承しているGUI開発ライブラリのことです。

この記事では、WindowsフォームのDataGridViewについて

  • DataGridViewとは
  • Windowsフォームの使い方
  • DataGridViewの使い方
  • データ・バインド


といった基本的な内容から、

  • 行を追加する際の注意
  • 行を削除する方法
  • ソートする方法
  • 検索する方法


など応用的な使い方についても解説していきます。

今回はWindowsフォームのDataGridViewについて、使い方をわかりやすく解説します。

目次

DataGiridViewとは

DataGridViewとはGUIで表データを表示、操作する場合に使うコントロールのことです。

Windowsフォームで用意されています。WindowsフォームはC言語などで使われるWin32 APIを継承したGUI開発ライブラリです。

Windowsフォームの使い方

それでは、早速使い方について説明していきます。DataGridViewの使い方を説明する前に、まずはWindowsフォームの使い方を説明しておきましょう。

まず、Visual Studioで「新しいプロジェクト」を作成します。
c#_wpf01

「Visual C#」→「Windows」→「クラシックデスクトップ」→「Windowsフォームアプリケーション」を選択し、アプリケーション名を入力して「OK」ボタンをクリックします。
c#_datagridview01

「Form1.cs」が自動で作成され、Windowsフォームを使うことができるようになりました。
c#_datagridview02

DataGridViewの使い方

Windowsフォームではボタン、テキストボックスなどGUIで使用する部品が「ツールボックス」にあらかじめ用意されています。

「Form1.cs」タブを選択し有効にすることで、「ツールボックス」から各コントロールを使うことができます。DataGridViewコントロールは「ツールボックス」の「データ」に用意されています。
c#_datagridview03

「DataGridView」をクリックし、「Form1.cs」のデザインの「Window」へドラッグ&ドロップすることで使えるようになります。
c#_datagridview04

「Window」をダブルクリックしてください。

すると「Form1.cs」に「Form1_Load」メソッドが自動で記述されます。ここにDataGridViewコントロールで表データを表示するためのコードを記述していきます。
c#_datagridview05

それではサンプルコードで確認しましょう。

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

        private void Form1_Load(object sender, EventArgs e) {
            
            // カラム数を指定
            dataGridView1.ColumnCount = 4;

            // カラム名を指定
            dataGridView1.Columns[0].HeaderText = "教科";
            dataGridView1.Columns[1].HeaderText = "点数";
            dataGridView1.Columns[2].HeaderText = "氏名";
            dataGridView1.Columns[3].HeaderText = "クラス名";

            // データを追加
            dataGridView1.Rows.Add("国語", 90, "田中 一郎", "A");
            dataGridView1.Rows.Add("数学", 50, "鈴木 二郎", "A");
            dataGridView1.Rows.Add("英語", 90, "佐藤 三郎", "B");
        }
}

実行結果:
c#_datagridview06

「DataGridView」をクリックし、「Form1.cs」のデザインの「Window」へドラッグ&ドロップすると自動で「dataGridView1」というDataGridView型のインスタンスが生成されます。

まずdataGridView1のプロパティColumnCountでカラム数を指定します。

次にプロパティColumns[].HeaderTextで表データのカラム名を指定します。

そしてRows.Addメソッドを使ってデータを一行ずつ入力していきます。

データ・バインド

Windowsフォームのコントロールとデータセットを連携させる機能のことを、データ・バインディングと呼びます。DataGridViewコントロールでも利用できます。

DataTableコントロールのDataSourceプロパティにセットします。

DataSourceの使い方

表のデータを入力する方法として、DataSourceプロパティを使う方法もあります。

まず、データを格納するクラスを作成します。ここでは、Testクラスを作成します。Test.cs:

public class Test {
        public string Subj { get; set; }
        public int Points { get; set; }
        public string Name { get; set; }
        public string ClassName { get; set; }
}

このクラスのリストを作成するTestListクラスを作成します。

TestList.cs:

public class TestList {
        public List<Test> Data { get; }
 
        // コンストラクタ(データ入力)
        public TestList() {
            Data = new List<Test> {
                new Test { Subj="国語", Points=90, Name="田中 一郎", ClassName="A" },
                new Test { Subj="数学", Points=50, Name="鈴木 二郎", ClassName="A" },
                new Test { Subj="英語", Points=90, Name="佐藤 三郎", ClassName="B" }
            };
        }
}

DataSourceプロパティにセットします。

Form1.cs:

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

        private void Form1_Load(object sender, EventArgs e) {

            // データを追加
            TestList testlist = new TestList();
            dataGridView1.DataSource = testlist.Data;

            // カラム名を指定
            dataGridView1.Columns[0].HeaderText = "教科";
            dataGridView1.Columns[1].HeaderText = "点数";
            dataGridView1.Columns[2].HeaderText = "氏名";
            dataGridView1.Columns[3].HeaderText = "クラス名";
        }
}

実行結果:
c#_datagridview06

DataTableを使う方法

DataSourceプロパティにDataTableクラスのオブジェクトを指定することもできます。

Form1.cs:

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

        private void Form1_Load(object sender, EventArgs e) {

            DataTable table = new DataTable("Table");

            // カラム名の追加
            table.Columns.Add("教科");
            table.Columns.Add("点数", Type.GetType("System.Int32"));
            table.Columns.Add("氏名");
            table.Columns.Add("クラス名");

            // Rows.Addメソッドを使ってデータを追加
            table.Rows.Add("国語", 90, "田中 一郎", "A");
            table.Rows.Add("数学", 50, "鈴木 二郎", "A");
            table.Rows.Add("英語", 90, "佐藤 三郎", "B");

            dataGridView1.DataSource = table;
        }
}

実行結果:
c#_datagridview06

DataTableクラスの使い方について、こちらで詳しく解説していますので、ぜひ参考にしてください。

行を追加する際の注意

コントロールがデータ・バインドされているときは、コントロールから行を追加することはできません。

以下のようになりますので、注意しましょう!

public partial class Form1 : Form {

        private DataTable table;

        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {

            table = new DataTable("Table");

            // カラム名の追加
            table.Columns.Add("教科");
            table.Columns.Add("点数", Type.GetType("System.Int32"));
            table.Columns.Add("氏名");
            table.Columns.Add("クラス名");

            // Rows.Addメソッドを使ってデータを追加
            table.Rows.Add("国語", 90, "田中 一郎", "A");  
            table.Rows.Add("数学", 50, "鈴木 二郎", "A");
            table.Rows.Add("英語", 90, "佐藤 三郎", "B");

            dataGridView1.DataSource = table;

            dataGridView1.Rows.Add("数学", 80, "田中 一郎", "A");
        }
}

実行結果:
c#_datagridview16

行を削除する方法

行を削除するにはRows.RemoveAtメソッドを使用します。Rows.RemoveAtメソッドの引数には削除する行のインデックス番号を指定します。

サンプルコードで確認しましょう。ボタンを使って削除するようにします。

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

        private void Form1_Load(object sender, EventArgs e) {
            DataTable table = new DataTable("Table");

            // カラム名の追加
            table.Columns.Add("教科");
            table.Columns.Add("点数", Type.GetType("System.Int32"));
            table.Columns.Add("氏名");
            table.Columns.Add("クラス名");

            // Rows.Addメソッドを使ってデータを追加
            table.Rows.Add("国語", 90, "田中 一郎", "A");
            table.Rows.Add("数学", 50, "鈴木 二郎", "A");
            table.Rows.Add("英語", 90, "佐藤 三郎", "B");

            dataGridView1.DataSource = table;
        }

        private void button1_Click(object sender, EventArgs e) {
            DataGridViewSelectedRowCollection src = dataGridView1.SelectedRows;
            for(int i = src.Count - 1; i >=0; i--) {
                dataGridView1.Rows.RemoveAt(src[i].Index);
            }
        }
}

実行結果:
削除前
c#_datagridview12

削除後
c#_datagridview13

選択した行のインデックス番号がずれないように、末尾の方から削除します。

ソートする方法

DataGridViewコントロールはカラム名をクリックすると昇順、さらにクリックすると降順に表示を並べ替えることができます。

c#_datagridview14

検索する方法

DataGridViewコントロールに表示されるデータを検索する場合について、サンプルコードでみていきましょう。

DataTableクラスを使って検索する方法をご紹介します。カラム名「教科」で検索する例です。

public partial class Form1 : Form {

        private DataTable table;

        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {

            table = new DataTable("Table");

            // カラム名の追加
            table.Columns.Add("教科");
            table.Columns.Add("点数", Type.GetType("System.Int32"));
            table.Columns.Add("氏名");
            table.Columns.Add("クラス名");

            // Rows.Addメソッドを使ってデータを追加
            table.Rows.Add("国語", 90, "田中 一郎", "A");
            table.Rows.Add("数学", 80, "田中 一郎", "A");
            table.Rows.Add("英語", 70, "田中 一郎", "A");
            table.Rows.Add("国語", 60, "鈴木 二郎", "A");
            table.Rows.Add("数学", 50, "鈴木 二郎", "A");
            table.Rows.Add("英語", 80, "鈴木 二郎", "A");
            table.Rows.Add("国語", 70, "佐藤 三郎", "B");
            table.Rows.Add("数学", 80, "佐藤 三郎", "B");
            table.Rows.Add("英語", 90, "佐藤 三郎", "B");

            dataGridView1.DataSource = table;
        }

        private void button1_Click(object sender, EventArgs e) {
            
            DataRow[] dRows = table.AsEnumerable()
                .Where(row => row.Field<string>("教科") == textBox1.Text).ToArray();

            DataTable sub = new DataTable("sub");

            // カラム名の追加
            sub.Columns.Add("教科");
            sub.Columns.Add("点数", Type.GetType("System.Int32"));
            sub.Columns.Add("氏名");
            sub.Columns.Add("クラス名");

            foreach(var row in dRows) {
                sub.Rows.Add(row[0], row[1], row[2], row[3]);
            }

            dataGridView2.DataSource = sub;            
        }
}

実行結果:
c#_datagridview15

DataTableクラスのオブジェクトをLINQを使って検索する方法について、こちらで詳しく解説しています。

ぜひ参考にしてください。

まとめ

ここではDataGridViewコントロールについて説明しました。

DataGridViewコントロールは表形式のデータを手軽に表示、操作することができます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次