web-dev-qa-db-ja.com

DataGridView読み取り専用セル

大量のデータを含むバインドされたDataGridViewがあります。問題は、一部のセルを読み取り専用にする必要があり、ユーザーがセル間でTABまたはENTERを使用してナビゲートする場合、読み取り専用セルをバイパスする必要があることです。ロード直後に特定のセルを読み取り専用にする最良の方法は何ですか?

グリッドに大量のデータがあることを考慮すると、データソースを設定した後にセルをループすることはお勧めできません。また、CellEnterでセルをReadOnlyにすることは機能しません。これは、Tabキーを使用してナビゲートするときに、次のセルがReadOnlyであるかどうかをすでに知っている必要があるためです。

15
Cory

データをバインドする前に、個々のセルではなく列を読み取り専用にするようにしてください。

this.dgrid.Columns["colName"].ReadOnly = true;

列内の個々のセルに対して行う必要がある場合は、ループして次のように設定する必要があります。

this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true;
23
Rashmi Pandit

CellBeginEditイベントを使用して、セルを無効にする必要がある場合はe.Cancel = Trueを設定できます。

Private Sub DataGridView_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewMsg.CellBeginEdit
    If DataGridViewMsg.Rows(e.RowIndex).Cells("disable").Value = "Y" Then
        e.Cancel = True
    End If
End Sub
3
Ismael
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;
1

私はこれを試していません。

しかし、RowEnterイベントで、セルの読み取り専用プロパティを(Rashmiに従って)trueに設定できますか?

RowEnterイベントは、ある行から別の行に移動したときに発生するはずです(または、セルA1からB3に変更したときに発生するはずです)。

それはまったく役に立ちますか?

1
shahkalpesh

列が読み取り専用になると(Rashmiの応答を参照)、このイベントを処理できます...

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Tab)
    {
        Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly;

        return;
    }

}

これにより、次のセルの読み取り専用プロパティが取得されます。

ありがとう

0
user110714

BeginningEditイベントを使用してこれを実行し、セルが条件を満たしているかどうかを確認し、満たしていない場合は操作をキャンセルできます。

以下の例では、セルにすでに値が含まれている場合、セルは操作をキャンセルし、読み取り専用と見なします。

xaml

<DataGrid BeginningEdit="DataGrid_BeginningEdit" ItemsSource="{Binding Example, Mode=TwoWay}"/>

c#

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    string content = (e.EditingEventArgs.Source as TextBlock).Text;

    if (!(String.IsNullOrEmpty(content)))
        e.Cancel = true;
}
0
Alfie