[C#] DataGridViewで選択行を取得・書き換えする方法

C#のDataGridViewで選択行を取得するには、SelectedRowsプロパティを使用します。

これは選択された行のコレクションを返します。

例えば、最初の選択行を取得するにはdataGridView.SelectedRows[0]を使用します。

選択行の特定のセルの値を取得または書き換えるには、RowsプロパティとCellsプロパティを組み合わせます。

例えば、1列目の値を取得するにはdataGridView.SelectedRows[0].Cells[0].Valueを使用し、書き換えるにはdataGridView.SelectedRows[0].Cells[0].Value = 新しい値とします。

これにより、ユーザーが選択した行のデータを動的に操作できます。

この記事でわかること
  • DataGridViewで選択行を取得する方法
  • セルの値を操作する手法
  • イベントを活用したデータ処理
  • 選択行のデータを活用する応用例
  • パフォーマンス向上のための設定

目次から探す

選択行の取得方法

SelectedRowsプロパティの使い方

DataGridViewコントロールのSelectedRowsプロパティを使用すると、現在選択されている行のコレクションを取得できます。

このプロパティは、選択された行の情報を簡単に取得するために非常に便利です。

以下は、SelectedRowsプロパティを使用して選択行のデータを取得するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void GetSelectedRows()
    {
        // 選択された行のコレクションを取得
        DataGridViewSelectedRowCollection selectedRows = dataGridView1.SelectedRows;
        // 選択された行の数を表示
        MessageBox.Show($"選択された行の数: {selectedRows.Count}");
        // 各選択行のデータを表示
        foreach (DataGridViewRow row in selectedRows)
        {
            string rowData = row.Cells[0].Value.ToString(); // 1列目のデータを取得
            MessageBox.Show($"選択行のデータ: {rowData}");
        }
    }
}

このコードでは、dataGridView1から選択された行を取得し、その数をメッセージボックスで表示しています。

また、各選択行の1列目のデータも表示しています。

選択行のインデックスを取得する

選択行のインデックスを取得するには、DataGridViewCurrentRowプロパティを使用します。

以下のサンプルコードでは、選択された行のインデックスを取得し、表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void GetSelectedRowIndex()
    {
        // 現在選択されている行のインデックスを取得
        int selectedIndex = dataGridView1.CurrentRow.Index;
        // インデックスを表示
        MessageBox.Show($"選択された行のインデックス: {selectedIndex}");
    }
}

このコードでは、CurrentRowプロパティを使用して選択された行のインデックスを取得し、メッセージボックスで表示しています。

複数行選択時の処理

DataGridViewで複数行を選択する場合、SelectedRowsプロパティを使用して、選択されたすべての行を処理することができます。

以下のサンプルコードでは、複数行が選択されている場合に、それぞれの行のデータを表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void GetMultipleSelectedRows()
    {
        // 選択された行のコレクションを取得
        DataGridViewSelectedRowCollection selectedRows = dataGridView1.SelectedRows;
        // 各選択行のデータを表示
        foreach (DataGridViewRow row in selectedRows)
        {
            string rowData = row.Cells[0].Value.ToString(); // 1列目のデータを取得
            MessageBox.Show($"選択行のデータ: {rowData}");
        }
    }
}

このコードでは、選択されたすべての行の1列目のデータをメッセージボックスで表示しています。

複数行が選択されている場合でも、簡単に処理を行うことができます。

選択行のデータ操作

セルの値を取得する方法

DataGridViewの選択行から特定のセルの値を取得するには、Cellsプロパティを使用します。

以下のサンプルコードでは、選択された行の特定のセルの値を取得し、表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void GetCellValue()
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行の1列目のセルの値を取得
            string cellValue = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            // セルの値を表示
            MessageBox.Show($"選択行の1列目のセルの値: {cellValue}");
        }
        else
        {
            MessageBox.Show("選択された行がありません。");
        }
    }
}

このコードでは、選択された行が存在する場合に、最初の選択行の1列目のセルの値を取得し、メッセージボックスで表示します。

選択行がない場合は、その旨を表示します。

セルの値を変更する方法

選択行の特定のセルの値を変更するには、Cellsプロパティを使用して新しい値を代入します。

以下のサンプルコードでは、選択された行の1列目のセルの値を変更します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void UpdateCellValue()
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行の1列目のセルの値を変更
            dataGridView1.SelectedRows[0].Cells[0].Value = "新しい値";
            // 更新後のセルの値を表示
            MessageBox.Show("セルの値を変更しました。");
        }
        else
        {
            MessageBox.Show("選択された行がありません。");
        }
    }
}

このコードでは、選択された行が存在する場合に、最初の選択行の1列目のセルの値を「新しい値」に変更し、変更完了のメッセージを表示します。

選択行がない場合は、その旨を表示します。

行全体のデータを更新する方法

選択行の全てのセルの値を一度に更新するには、Cellsプロパティを使用して各セルに新しい値を代入します。

以下のサンプルコードでは、選択された行のすべてのセルの値を更新します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void UpdateRowData()
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行の各セルの値を更新
            DataGridViewRow selectedRow = dataGridView1.SelectedRows[0];
            selectedRow.Cells[0].Value = "新しい値1"; // 1列目
            selectedRow.Cells[1].Value = "新しい値2"; // 2列目
            selectedRow.Cells[2].Value = "新しい値3"; // 3列目
            // 更新完了のメッセージを表示
            MessageBox.Show("行のデータを変更しました。");
        }
        else
        {
            MessageBox.Show("選択された行がありません。");
        }
    }
}

このコードでは、選択された行が存在する場合に、最初の選択行の各セルの値をそれぞれ「新しい値1」、「新しい値2」、「新しい値3」に変更し、変更完了のメッセージを表示します。

選択行がない場合は、その旨を表示します。

DataGridViewのイベント活用

SelectionChangedイベントの使い方

DataGridViewSelectionChangedイベントは、選択行が変更されたときに発生します。

このイベントを利用することで、選択された行のデータをリアルタイムで取得したり、他のコントロールに反映させたりすることができます。

以下のサンプルコードでは、選択行が変更された際に、その行のデータを表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // SelectionChangedイベントにイベントハンドラを追加
        dataGridView1.SelectionChanged += DataGridView1_SelectionChanged;
    }
    private void DataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行の1列目のセルの値を取得
            string cellValue = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            // セルの値を表示
            MessageBox.Show($"選択行の1列目のセルの値: {cellValue}");
        }
    }
}

このコードでは、SelectionChangedイベントが発生するたびに、選択された行の1列目のセルの値をメッセージボックスで表示します。

CellValueChangedイベントでの処理

CellValueChangedイベントは、セルの値が変更されたときに発生します。

このイベントを利用することで、セルの値が変更された際に特定の処理を実行することができます。

以下のサンプルコードでは、セルの値が変更された際に、その新しい値を表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // CellValueChangedイベントにイベントハンドラを追加
        dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
    }
    private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        // 変更されたセルの新しい値を取得
        string newValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
        // 新しい値を表示
        MessageBox.Show($"セルの新しい値: {newValue}");
    }
}

このコードでは、CellValueChangedイベントが発生するたびに、変更されたセルの新しい値をメッセージボックスで表示します。

RowEnterイベントでの行データ取得

RowEnterイベントは、行が選択されたときに発生します。

このイベントを利用することで、選択された行のデータを取得し、他のコントロールに表示することができます。

以下のサンプルコードでは、行が選択された際に、その行のデータを表示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // RowEnterイベントにイベントハンドラを追加
        dataGridView1.RowEnter += DataGridView1_RowEnter;
    }
    private void DataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
    {
        // 選択された行の1列目のセルの値を取得
        string cellValue = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
        // セルの値を表示
        MessageBox.Show($"選択された行の1列目のセルの値: {cellValue}");
    }
}

このコードでは、RowEnterイベントが発生するたびに、選択された行の1列目のセルの値をメッセージボックスで表示します。

これにより、ユーザーが行を選択するたびに、その行のデータを確認することができます。

応用例

選択行のデータを別のコントロールに表示する

選択行のデータを別のコントロール(例えば、TextBox)に表示することで、ユーザーが選択したデータを簡単に確認できるようにすることができます。

以下のサンプルコードでは、選択された行の1列目のデータをTextBoxに表示します。

partial class MyForm : Form
{
    private TextBox textBox1;
    public MyForm()
    {
        InitializeComponent();
        textBox1 = new TextBox { Location = new Point(10, 10), Width = 200 };
        this.Controls.Add(textBox1);
        dataGridView1.SelectionChanged += DataGridView1_SelectionChanged;
    }
    private void DataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行の1列目のセルの値を取得
            string cellValue = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            // TextBoxに表示
            textBox1.Text = cellValue;
        }
    }
}

このコードでは、SelectionChangedイベントを利用して、選択された行の1列目のデータをTextBoxに表示しています。

選択行のデータをデータベースに保存する

選択行のデータをデータベースに保存することで、アプリケーションのデータを永続化することができます。

以下のサンプルコードでは、選択された行のデータをSQLiteデータベースに保存します。

using System.Data.SQLite;
partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void SaveSelectedRowToDatabase()
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // 最初の選択行のデータを取得
            string cellValue = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            // データベース接続
            using (SQLiteConnection connection = new SQLiteConnection("Data Source=mydatabase.db;Version=3;"))
            {
                connection.Open();
                string query = "INSERT INTO MyTable (ColumnName) VALUES (@value)";
                using (SQLiteCommand command = new SQLiteCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@value", cellValue);
                    command.ExecuteNonQuery();
                }
            }
            MessageBox.Show("データをデータベースに保存しました。");
        }
        else
        {
            MessageBox.Show("選択された行がありません。");
        }
    }
}

このコードでは、選択された行の1列目のデータをSQLiteデータベースに保存しています。

データベース接続を行い、SQL文を実行してデータを挿入します。

選択行のデータをCSVファイルにエクスポートする

選択行のデータをCSVファイルにエクスポートすることで、データを外部で利用できるようにすることができます。

以下のサンプルコードでは、選択された行のデータをCSVファイルに書き出します。

using System.IO;
partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void ExportSelectedRowToCSV()
    {
        // 選択された行があるか確認
        if (dataGridView1.SelectedRows.Count > 0)
        {
            // CSVファイルのパス
            string filePath = "exported_data.csv";
            using (StreamWriter writer = new StreamWriter(filePath, true))
            {
                // 最初の選択行のデータを取得
                DataGridViewRow selectedRow = dataGridView1.SelectedRows[0];
                string rowData = string.Join(",", selectedRow.Cells.Cast<DataGridViewCell>().Select(cell => cell.Value.ToString()));
                // CSVファイルに書き込む
                writer.WriteLine(rowData);
            }
            MessageBox.Show("データをCSVファイルにエクスポートしました。");
        }
        else
        {
            MessageBox.Show("選択された行がありません。");
        }
    }
}

このコードでは、選択された行のすべてのセルのデータをCSV形式でファイルに書き出しています。

StreamWriterを使用してファイルにデータを追加し、エクスポート完了のメッセージを表示します。

よくある質問

複数行選択を無効にするにはどうすればいいですか?

DataGridViewで複数行選択を無効にするには、SelectionModeプロパティを設定します。

以下のように、SelectionModeDataGridViewSelectionMode.FullRowSelectに設定し、MultiSelectプロパティをfalseにすることで、単一行選択のみを許可できます。

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false; // 複数行選択を無効にする

この設定により、ユーザーは1行のみを選択できるようになります。

選択行がない場合のエラーハンドリングは?

選択行がない場合のエラーハンドリングは、選択行の数を確認することで行います。

以下のように、SelectedRows.Countをチェックし、選択行がない場合には適切なメッセージを表示することができます。

if (dataGridView1.SelectedRows.Count == 0)
{
    MessageBox.Show("選択された行がありません。");
    return; // 処理を中断
}

このようにすることで、選択行がない場合にエラーを防ぎ、ユーザーに適切なフィードバックを提供できます。

DataGridViewのパフォーマンスを向上させる方法は?

DataGridViewのパフォーマンスを向上させるためには、以下の方法を検討できます。

  • VirtualModeを使用する: 大量のデータを扱う場合、VirtualModeを有効にすることで、必要なデータのみを表示し、メモリ使用量を削減できます。
  • DoubleBufferedを有効にする: フリッカリングを防ぐために、DoubleBufferedプロパティをtrueに設定します。
  • AutoGenerateColumnsを無効にする: 列を手動で定義し、AutoGenerateColumnsfalseに設定することで、パフォーマンスを向上させることができます。
  • データのバインディングを最適化する: データソースの変更が頻繁に行われる場合、バインディングの方法を見直し、必要なデータのみを更新するようにします。

これらの方法を組み合わせることで、DataGridViewのパフォーマンスを向上させることができます。

まとめ

この記事では、C#のDataGridViewを使用して選択行の取得やデータ操作、イベントの活用方法について詳しく解説しました。

特に、選択行のデータを別のコントロールに表示したり、データベースに保存したり、CSVファイルにエクスポートする方法など、実用的な応用例を紹介しました。

これらの知識を活用して、よりインタラクティブで使いやすいアプリケーションを作成することができるでしょう。

ぜひ、実際のプロジェクトに取り入れて、DataGridViewの機能を最大限に活用してみてください。

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

関連カテゴリーから探す

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