大量のデータを含むバインドされたDataGridViewがあります。問題は、一部のセルを読み取り専用にする必要があり、ユーザーがセル間でTABまたはENTERを使用してナビゲートする場合、読み取り専用セルをバイパスする必要があることです。ロード直後に特定のセルを読み取り専用にする最良の方法は何ですか?
グリッドに大量のデータがあることを考慮すると、データソースを設定した後にセルをループすることはお勧めできません。また、CellEnterでセルをReadOnlyにすることは機能しません。これは、Tabキーを使用してナビゲートするときに、次のセルがReadOnlyであるかどうかをすでに知っている必要があるためです。
データをバインドする前に、個々のセルではなく列を読み取り専用にするようにしてください。
this.dgrid.Columns["colName"].ReadOnly = true;
列内の個々のセルに対して行う必要がある場合は、ループして次のように設定する必要があります。
this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true;
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
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;
私はこれを試していません。
しかし、RowEnterイベントで、セルの読み取り専用プロパティを(Rashmiに従って)trueに設定できますか?
RowEnterイベントは、ある行から別の行に移動したときに発生するはずです(または、セルA1からB3に変更したときに発生するはずです)。
それはまったく役に立ちますか?
列が読み取り専用になると(Rashmiの応答を参照)、このイベントを処理できます...
private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Tab)
{
Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly;
return;
}
}
これにより、次のセルの読み取り専用プロパティが取得されます。
ありがとう
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;
}