注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
DataGridView内のすべてのセルを編集できないようにするには、DataGridView.ReadOnlyプロパティをTrueにします。
ただしこの場合でも行の削除はできます。また、行の最後に表示される新しい行(新規行)も表示されますが、入力はできなくなります。行の削除を禁止する方法はこちらで、新規行の表示を禁止する方法はこちらで説明しています。
'DataGridView1のセルを読み取り専用にする DataGridView1.ReadOnly = True
//DataGridView1のセルを読み取り専用にする DataGridView1.ReadOnly = true;
補足:上記のようなコードを書く方法以外に、Visual Studioのスマートタグで、「編集を有効にする」のチェックを外す方法もあります。
指定した列、行、セルのみを編集できないようにするには、それぞれDataGridViewColumn、DataGridViewRow、DataGridViewCellオブジェクトのReadOnlyプロパティをTrueにします。
'DataGridView1の2番目の列を読み取り専用にする DataGridView1.Columns(1).ReadOnly = True 'DataGridView1の3番目の行を読み取り専用にする DataGridView1.Rows(2).ReadOnly = True 'DataGridView1の(0, 0)のセルを読み取り専用にする DataGridView1(0, 0).ReadOnly = True
//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に戻ってしまいます。
DataGridView.EditModeプロパティをDataGridViewEditMode.EditProgrammaticallyにすることにより、ユーザーがセルを編集することはできなくなります。ただし、プログラムでDataGridView.BeginEditメソッドを呼び出すことにより、セルを編集モードにすることはできます。
'ユーザーがセルを編集できないようにする
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
//ユーザーがセルを編集できないようにする
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
一つ一つのセルのReadOnlyプロパティを変更するのではなく、CellBeginEditイベントハンドラでセルを編集できないようにすることもできます。
次の例では、Column2列がTrueの場合のみColumn1列のセルを編集できるようにしています。
'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
//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; } }