DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridViewの指定したセルを編集できないようにする

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

ReadOnlyプロパティを使用する

DataGridView内のすべてのセルを編集できないようにする

DataGridView内のすべてのセルを編集できないようにするには、DataGridView.ReadOnlyプロパティをTrueにします。

ただしこの場合でも行の削除はできます。また、行の最後に表示される新しい行(新規行)も表示されますが、入力はできなくなります。行の削除を禁止する方法はこちらで、新規行の表示を禁止する方法はこちらで説明しています。

VB.NET
コードを隠すコードを選択
'DataGridView1のセルを読み取り専用にする
DataGridView1.ReadOnly = True
C#
コードを隠すコードを選択
//DataGridView1のセルを読み取り専用にする
DataGridView1.ReadOnly = true;
補足:上記のようなコードを書く方法以外に、Visual Studioのスマートタグで、「編集を有効にする」のチェックを外す方法もあります。

指定した列、行、セルのみを編集できないようにする

指定した列、行、セルのみを編集できないようにするには、それぞれDataGridViewColumn、DataGridViewRow、DataGridViewCellオブジェクトのReadOnlyプロパティをTrueにします。

VB.NET
コードを隠すコードを選択
'DataGridView1の2番目の列を読み取り専用にする
DataGridView1.Columns(1).ReadOnly = True

'DataGridView1の3番目の行を読み取り専用にする
DataGridView1.Rows(2).ReadOnly = True

'DataGridView1の(0, 0)のセルを読み取り専用にする
DataGridView1(0, 0).ReadOnly = True
C#
コードを隠すコードを選択
//DataGridView1の2番目の列を読み取り専用にする
DataGridView1.Columns[1].ReadOnly = true;

//DataGridView1の3番目の行を読み取り専用にする
DataGridView1.Rows[2].ReadOnly = true;

//DataGridView1の(0, 0)のセルを読み取り専用にする
DataGridView1[0, 0].ReadOnly = true;

DataGridViewのReadOnlyがTrueに設定されると、そのDataGridView内のすべての行、列、セルのReadOnlyがTrueになります。同じように、列や行のReadOnlyがTrueに設定されると、その列や行にあるすべてのセルのReadOnlyがTrueになります。

上のコードのように、特定の行、列、セルのReadOnlyをTrueにしたとしても、その後DataGridViewのReadOnlyをTrueにしてからFalseにすると、すべての行、列、セルのReadOnlyはFalseに戻ってしまいます。同じように特定のセルのReadOnlyをTrueにしたとしても、そのセルがある行や列のReadOnlyをTrueにしてからFalseにすると、そのセルのReadOnlyもFalseに戻ってしまいます。

EditModeプロパティを使用する

DataGridView.EditModeプロパティをDataGridViewEditMode.EditProgrammaticallyにすることにより、ユーザーがセルを編集することはできなくなります。ただし、プログラムでDataGridView.BeginEditメソッドを呼び出すことにより、セルを編集モードにすることはできます。

VB.NET
コードを隠すコードを選択
'ユーザーがセルを編集できないようにする
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
C#
コードを隠すコードを選択
//ユーザーがセルを編集できないようにする
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;

条件に応じてセルを編集できないようにする

一つ一つのセルのReadOnlyプロパティを変更するのではなく、CellBeginEditイベントハンドラでセルを編集できないようにすることもできます。

次の例では、Column2列がTrueの場合のみColumn1列のセルを編集できるようにしています。

VB.NET
コードを隠すコードを選択
'CellBeginEditイベントハンドラ
Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, _
        ByVal e As DataGridViewCellCancelEventArgs) _
        Handles DataGridView1.CellBeginEdit
    Dim dgv As DataGridView = CType(sender, DataGridView)
    '編集できるか判断する
    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
        Not CBool(dgv("Column2", e.RowIndex).Value) Then
        '編集できないようにする
        e.Cancel = True
    End If
End Sub
C#
コードを隠すコードを選択
//CellBeginEditイベントハンドラ
private void DataGridView1_CellBeginEdit(object sender,
    DataGridViewCellCancelEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    //編集できるか判断する
    if (dgv.Columns[e.ColumnIndex].Name == "Column1" &&
        !(bool)dgv["Column2", e.RowIndex].Value)
    {
        //編集できないようにする
        e.Cancel = true;
    }
}
  • 履歴:
  • 2012/6/29 新規行の表示を禁止する方法のリンク先が間違えていたのを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。