【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コントロールは表形式のデータを手軽に表示、操作することができます。

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

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次