[C#] BindingNavigatorとDataGridViewの使用例

BindingNavigatorとDataGridViewは、C#のWindowsフォームアプリケーションでデータを表示および操作するためのコントロールです。

BindingNavigatorは、データのナビゲーションや操作(追加、削除、保存など)を行うためのツールバーを提供します。

一方、DataGridViewは、データを表形式で表示し、編集可能にするためのコントロールです。

使用例としては、データベースからデータを取得し、BindingSourceを介してDataGridViewにバインドします。

BindingNavigatorはこのBindingSourceに接続され、ユーザーがデータを簡単に操作できるようにします。

これにより、ユーザーはデータのページングや編集を直感的に行うことができます。

この記事でわかること
  • BindingNavigatorとDataGridViewの基本的な使い方
  • データベースとの接続方法と設定
  • データの取得、表示、更新の手法
  • フィルタリングやソートの実装方法
  • カスタムボタンの追加と複数テーブルの管理方法

目次から探す

BindingNavigatorとDataGridViewの概要

BindingNavigatorとは

BindingNavigatorは、Windowsフォームアプリケーションにおいて、データのナビゲーションを簡単に行うためのコントロールです。

主に、データの追加、削除、移動、保存などの操作を行うためのボタンを提供します。

これにより、ユーザーはデータの操作を直感的に行うことができ、アプリケーションの使いやすさが向上します。

BindingNavigatorは、BindingSourceと連携して動作し、データの状態を管理します。

DataGridViewとは

DataGridViewは、データを表形式で表示するためのコントロールです。

多くのデータを効率的に表示し、ユーザーがデータを編集、削除、追加できるように設計されています。

DataGridViewは、カスタマイズが容易で、さまざまなデータソース(例えば、データベースやリスト)からデータをバインドすることができます。

また、列のカスタマイズやセルのスタイル設定も可能です。

両者の連携のメリット

BindingNavigatorとDataGridViewを組み合わせることで、以下のようなメリットがあります。

スクロールできます
メリット説明
ユーザーインターフェースの向上データのナビゲーションが直感的になる。
データ操作の簡素化データの追加、削除、移動が簡単に行える。
一貫性のあるデータ管理BindingSourceを介してデータの状態を一元管理。
カスタマイズ性の向上DataGridViewのカスタマイズにより、見た目や機能を自由に変更可能。

このように、BindingNavigatorとDataGridViewを組み合わせることで、ユーザーにとって使いやすく、効率的なデータ操作が可能になります。

BindingNavigatorの設定

BindingSourceの作成

BindingSourceは、データのバインディングを管理するためのクラスです。

BindingNavigatorとDataGridViewを使用する際には、まずBindingSourceを作成し、データソースを設定する必要があります。

以下は、BindingSourceを作成するサンプルコードです。

partial class MyForm : Form
{
    private BindingSource bindingSource;
    public MyForm()
    {
        InitializeComponent();
        InitializeBindingSource(); // BindingSourceの初期化
    }
    private void InitializeBindingSource()
    {
        bindingSource = new BindingSource(); // BindingSourceのインスタンスを作成
        bindingSource.DataSource = GetData(); // データソースを設定
    }
    private List<MyData> GetData()
    {
        // データを取得するメソッド
        return new List<MyData>()
        {
            new MyData { Id = 1, Name = "データ1" },
            new MyData { Id = 2, Name = "データ2" }
        };
    }
}

このコードでは、BindingSourceのインスタンスを作成し、GetDataメソッドから取得したデータをデータソースとして設定しています。

BindingNavigatorのプロパティ設定

BindingNavigatorを設定するためには、プロパティを適切に設定する必要があります。

以下は、BindingNavigatorのプロパティを設定するサンプルコードです。

private void InitializeBindingNavigator()
{
    BindingNavigator bindingNavigator = new BindingNavigator(true); // BindingNavigatorのインスタンスを作成
    bindingNavigator.BindingSource = bindingSource; // BindingSourceを設定
    // BindingNavigatorのプロパティを設定
    bindingNavigator.Dock = DockStyle.Top; // 上部に配置
    bindingNavigator.AddNewItem = new ToolStripButton("追加"); // 新規追加ボタン
    bindingNavigator.DeleteItem = new ToolStripButton("削除"); // 削除ボタン
    this.Controls.Add(bindingNavigator); // フォームに追加
}

このコードでは、BindingNavigatorのインスタンスを作成し、BindingSourceを設定しています。

また、ナビゲーションボタンの配置や機能も設定しています。

イベントハンドラの追加

BindingNavigatorのボタンに対してイベントハンドラを追加することで、ボタンがクリックされたときの動作を定義できます。

以下は、追加ボタンと削除ボタンのイベントハンドラを追加するサンプルコードです。

private void InitializeBindingNavigator()
{
    // 省略
    // イベントハンドラの追加
    bindingNavigator.AddNewItem.Click += AddNewItem_Click; // 新規追加ボタンのクリックイベント
    bindingNavigator.DeleteItem.Click += DeleteItem_Click; // 削除ボタンのクリックイベント
}
private void AddNewItem_Click(object sender, EventArgs e)
{
    bindingSource.Add(new MyData { Id = 3, Name = "新しいデータ" }); // 新しいデータを追加
}
private void DeleteItem_Click(object sender, EventArgs e)
{
    bindingSource.RemoveCurrent(); // 現在のデータを削除
}

このコードでは、新規追加ボタンと削除ボタンのクリックイベントに対して、それぞれの処理を定義しています。

これにより、ユーザーがボタンをクリックした際に、データの追加や削除が行えるようになります。

DataGridViewの設定

データバインディングの方法

DataGridViewにデータを表示するためには、BindingSourceを介してデータバインディングを行います。

以下は、DataGridViewにBindingSourceをバインドするサンプルコードです。

partial class MyForm : Form
{
    private DataGridView dataGridView;
    public MyForm()
    {
        InitializeComponent();
        InitializeDataGridView(); // DataGridViewの初期化
    }
    private void InitializeDataGridView()
    {
        dataGridView = new DataGridView(); // DataGridViewのインスタンスを作成
        dataGridView.DataSource = bindingSource; // BindingSourceをデータソースとして設定
        dataGridView.Dock = DockStyle.Fill; // フォームにフィットさせる
        this.Controls.Add(dataGridView); // フォームに追加
    }
}

このコードでは、DataGridViewのインスタンスを作成し、BindingSourceをデータソースとして設定しています。

これにより、BindingSourceにバインドされたデータがDataGridViewに表示されます。

カラムの設定とカスタマイズ

DataGridViewでは、表示するカラムをカスタマイズすることができます。

以下は、カラムの設定を行うサンプルコードです。

private void InitializeDataGridView()
{
    // 省略
    // カラムの設定
    dataGridView.AutoGenerateColumns = false; // 自動生成を無効にする
    dataGridView.Columns.Add(new DataGridViewTextBoxColumn() // テキストボックスカラムを追加
    {
        DataPropertyName = "Id", // データソースのプロパティ名
        HeaderText = "ID", // ヘッダーのテキスト
        Width = 50 // 幅の設定
    });
    dataGridView.Columns.Add(new DataGridViewTextBoxColumn() // テキストボックスカラムを追加
    {
        DataPropertyName = "Name",
        HeaderText = "名前",
        Width = 150
    });
}

このコードでは、AutoGenerateColumnsfalseに設定し、手動でカラムを追加しています。

各カラムには、データソースのプロパティ名やヘッダーのテキストを設定しています。

データの編集と検証

DataGridViewでは、ユーザーがデータを編集できるように設定することができます。

また、データの検証を行うことも可能です。

以下は、データの編集と検証を行うサンプルコードです。

private void InitializeDataGridView()
{
    // 省略
    // データの編集を有効にする
    dataGridView.ReadOnly = false; // 編集可能に設定
    // データの検証
    dataGridView.CellValidating += DataGridView_CellValidating; // 検証イベントの追加
}
private void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (e.ColumnIndex == 1) // 名前のカラムを検証
    {
        if (string.IsNullOrWhiteSpace(e.FormattedValue.ToString())) // 空白チェック
        {
            e.Cancel = true; // 編集をキャンセル
            MessageBox.Show("名前を入力してください。"); // エラーメッセージ
        }
    }
}

このコードでは、DataGridViewのセルが編集される際に、CellValidatingイベントを使用して検証を行っています。

名前のカラムが空白の場合、編集をキャンセルし、エラーメッセージを表示します。

これにより、データの整合性を保つことができます。

データベースとの連携

データベース接続の設定

C#でデータベースに接続するためには、SqlConnectionクラスを使用します。

以下は、SQL Serverデータベースへの接続を設定するサンプルコードです。

using System.Data.SqlClient;
partial class MyForm : Form
{
    private SqlConnection connection;
    public MyForm()
    {
        InitializeComponent();
        InitializeDatabaseConnection(); // データベース接続の初期化
    }
    private void InitializeDatabaseConnection()
    {
        string connectionString = "Server=your_server;Database=your_database;User Id=your_username;Password=your_password;"; // 接続文字列
        connection = new SqlConnection(connectionString); // SqlConnectionのインスタンスを作成
    }
}

このコードでは、接続文字列を指定してSqlConnectionのインスタンスを作成しています。

接続文字列には、サーバー名、データベース名、ユーザー名、パスワードを設定します。

データの取得と表示

データベースからデータを取得するためには、SqlCommandを使用してSQLクエリを実行します。

以下は、データを取得してBindingSourceに設定するサンプルコードです。

private void LoadData()
{
    string query = "SELECT Id, Name FROM MyTable"; // SQLクエリ
    SqlCommand command = new SqlCommand(query, connection); // SqlCommandのインスタンスを作成
    try
    {
        connection.Open(); // データベース接続を開く
        SqlDataReader reader = command.ExecuteReader(); // クエリを実行
        List<MyData> dataList = new List<MyData>(); // データを格納するリスト
        while (reader.Read()) // データを読み込む
        {
            dataList.Add(new MyData
            {
                Id = reader.GetInt32(0), // IDを取得
                Name = reader.GetString(1) // 名前を取得
            });
        }
        bindingSource.DataSource = dataList; // BindingSourceにデータを設定
    }
    catch (Exception ex)
    {
        MessageBox.Show("データの取得に失敗しました: " + ex.Message); // エラーメッセージ
    }
    finally
    {
        connection.Close(); // データベース接続を閉じる
    }
}

このコードでは、SQLクエリを実行してデータを取得し、List<MyData>に格納しています。

その後、BindingSourceにデータを設定することで、DataGridViewに表示されるようになります。

データの更新と保存

データベースに対してデータを更新するためには、SqlCommandを使用してUPDATE文を実行します。

以下は、データの更新と保存を行うサンプルコードです。

private void SaveData()
{
    string query = "UPDATE MyTable SET Name = @Name WHERE Id = @Id"; // UPDATE文
    SqlCommand command = new SqlCommand(query, connection); // SqlCommandのインスタンスを作成
    command.Parameters.AddWithValue("@Name", "新しい名前"); // パラメータの設定
    command.Parameters.AddWithValue("@Id", 1); // 更新するIDの設定
    try
    {
        connection.Open(); // データベース接続を開く
        int rowsAffected = command.ExecuteNonQuery(); // クエリを実行
        if (rowsAffected > 0) // 更新が成功した場合
        {
            MessageBox.Show("データが更新されました。"); // 成功メッセージ
        }
        else
        {
            MessageBox.Show("データの更新に失敗しました。"); // 失敗メッセージ
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("データの更新に失敗しました: " + ex.Message); // エラーメッセージ
    }
    finally
    {
        connection.Close(); // データベース接続を閉じる
    }
}

このコードでは、UPDATE文を使用してデータを更新しています。

パラメータを使用することで、SQLインジェクションのリスクを軽減しています。

データの更新が成功した場合には、成功メッセージを表示します。

応用例

フィルタリングとソートの実装

DataGridViewでは、ユーザーが表示されているデータをフィルタリングしたり、ソートしたりすることができます。

以下は、BindingSourceを使用してフィルタリングとソートを実装するサンプルコードです。

private void FilterData(string filter)
{
    bindingSource.Filter = $"Name LIKE '%{filter}%'"; // 名前にフィルタを適用
}
private void SortData(string sortColumn)
{
    bindingSource.Sort = $"{sortColumn} ASC"; // 指定したカラムで昇順ソート
}

このコードでは、FilterDataメソッドで名前に基づくフィルタリングを行い、SortDataメソッドで指定したカラムでのソートを実行しています。

これにより、ユーザーは必要なデータを簡単に見つけることができます。

カスタムボタンの追加

BindingNavigatorにカスタムボタンを追加することで、特定の機能を実装することができます。

以下は、カスタムボタンを追加し、その機能を実装するサンプルコードです。

private void InitializeBindingNavigator()
{
    // 省略
    // カスタムボタンの追加
    ToolStripButton customButton = new ToolStripButton("カスタムアクション");
    customButton.Click += CustomButton_Click; // クリックイベントの追加
    bindingNavigator.Items.Add(customButton); // BindingNavigatorに追加
}
private void CustomButton_Click(object sender, EventArgs e)
{
    MessageBox.Show("カスタムアクションが実行されました。"); // カスタムアクションの処理
}

このコードでは、BindingNavigatorに「カスタムアクション」というボタンを追加し、クリック時にメッセージボックスを表示する処理を実装しています。

これにより、ユーザーは特定のアクションを簡単に実行できます。

複数テーブルの管理

複数のテーブルを管理する場合、各テーブルに対してBindingSourceを作成し、それぞれのDataGridViewにバインドすることができます。

以下は、複数のテーブルを管理するサンプルコードです。

private BindingSource bindingSource1;
private BindingSource bindingSource2;
private void LoadMultipleTables()
{
    // テーブル1のデータを取得
    bindingSource1 = new BindingSource();
    bindingSource1.DataSource = GetDataFromTable1(); // テーブル1のデータ取得メソッド
    // テーブル2のデータを取得
    bindingSource2 = new BindingSource();
    bindingSource2.DataSource = GetDataFromTable2(); // テーブル2のデータ取得メソッド
    // DataGridViewにバインド
    dataGridView1.DataSource = bindingSource1; // DataGridView1にテーブル1をバインド
    dataGridView2.DataSource = bindingSource2; // DataGridView2にテーブル2をバインド
}

このコードでは、2つのBindingSourceを作成し、それぞれ異なるテーブルのデータを取得してバインドしています。

これにより、複数のテーブルを同時に管理し、表示することが可能になります。

よくある質問

BindingNavigatorのボタンをカスタマイズできますか?

はい、BindingNavigatorのボタンはカスタマイズ可能です。

デフォルトのボタンに加えて、独自のボタンを追加することができます。

以下の手順でカスタムボタンを追加できます。

  • BindingNavigatorのインスタンスを作成します。
  • ToolStripButtonを作成し、必要なプロパティを設定します。
  • クリックイベントを追加して、ボタンの動作を定義します。
  • BindingNavigatorのItemsコレクションにカスタムボタンを追加します。
ToolStripButton customButton = new ToolStripButton("カスタムボタン");
customButton.Click += CustomButton_Click; // クリックイベントの追加
bindingNavigator.Items.Add(customButton); // BindingNavigatorに追加

DataGridViewでのデータ編集を無効にする方法は?

DataGridViewでのデータ編集を無効にするには、ReadOnlyプロパティをtrueに設定します。

これにより、ユーザーはセルの内容を編集できなくなります。

以下のように設定します。

dataGridView.ReadOnly = true; // 編集を無効にする

また、特定のカラムだけを編集不可にしたい場合は、各カラムのReadOnlyプロパティを設定することもできます。

dataGridView.Columns["Id"].ReadOnly = true; // IDカラムを編集不可にする

データベース接続が失敗する場合の対処法は?

データベース接続が失敗する場合、以下の点を確認してください。

  1. 接続文字列の確認: サーバー名、データベース名、ユーザー名、パスワードが正しいか確認します。
  2. データベースの稼働状況: データベースサーバーが稼働しているか確認します。
  3. ファイアウォールの設定: データベースサーバーへの接続がファイアウォールでブロックされていないか確認します。
  4. SQL Serverの設定: SQL Serverがリモート接続を許可しているか確認します。
  5. 例外処理の実装: 接続失敗時に適切なエラーメッセージを表示するために、例外処理を実装します。
try
{
    connection.Open(); // 接続を試みる
}
catch (SqlException ex)
{
    MessageBox.Show("接続に失敗しました: " + ex.Message); // エラーメッセージを表示
}

これらの確認を行うことで、接続の問題を特定し、解決する手助けになります。

まとめ

この記事では、C#のBindingNavigatorとDataGridViewを使用したデータ管理の基本から応用までを解説しました。

これにより、データの表示や操作を効率的に行う方法を学ぶことができました。

特に、データベースとの連携やフィルタリング、カスタムボタンの追加など、実践的な技術を身につけることで、より高度なアプリケーションを開発するための基盤を築くことができます。

次のステップとして、実際に自分のプロジェクトにこれらの技術を取り入れ、さらなる機能を追加してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す