Copyright © GrapeCity inc. All rights reserved.
True DBGrid for WinForms
セルのコンテンツを一度のキー操作で変更する
セルの編集テクニック > 編集イベントを処理する > セルのコンテンツを一度のキー操作で変更する

BeforeColEdit イベントを使用してTrueDBGrid for WindowsForms コントロールの編集操作をカスタマイズすることができます。BeforeColEdit は、他の編集イベントより前に発生するため、編集を開始する前に、事実上どのような操作を行うこともできます。たとえば、編集の要求をキャンセルして、組み込みテキストエディタの代わりに独自のドロップダウンリストボックスを表示できます。

C1TrueDBGrid コントロールでは、次の4つの方法で編集モードに入ることができます。

  1.  EditActive
  2. 現在のセルをクリックすると、現在のセルにあるコンテンツの編集が開始される。
  3. F2 キーを押しても、現在のセルにあるコンテンツの編集が開始される。
  4. 入力を開始すると、その文字がセルのコンテンツになり、編集が開始される。
  5. コード内で EditActive プロパティを設定して、強制的に編集を開始する。

1、2、および3の方法では BeforeColEdit イベントが発生しますが、4の方法ではこのイベントが発生しません。TrueDBGrid for WindowsForms では、コードからの要求をキャンセルすることはないとしています。

ユーザーの編集要求でマウスとキーボードのどちらが使用されたかを判別できます。そのために、BeforeColEdit イベントの引数の1つに KeyChar があります。この引数は、ユーザーがセルをクリックして編集を開始すると0に、文字を入力すると ASCII 文字の1つに設定されます。

BeforeColEdit が発生したとき、ASCII 文字はまだ現在のセルに置かれていません。そのため、BeforeColEdit で編集をキャンセルすると、ASCII キーは破棄されます。これは便利なテクニックです。

Done という名前のブール値フィールドがあり、その表示書式として NumberFormat プロパティを Yes/No に設定しているとします。この場合に、ユーザーが Y キーまたは N キーを押すと、編集モードに入るのではなく、ただちにセルのコンテンツを変更するとします。BeforeColEdit で次のコードを使用すると、これらの動作を実行できます。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub C1TrueDBGrid1_BeforeColEdit(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.BeforeColEditEventArgs) Handles C1TrueDBGrid1.BeforeColEdit
    With Me.C1TrueDBGrid1.Columns(e.ColIndex)
 
        ' これが「Done」列でないか、ユーザーがマウスでクリックした場合は、そのまま続行します
        If .DataField <> "Done" Or e.KeyChar = Chr(0) Then Exit Sub
 
        ' 通常の編集をキャンセルし、KeyAscii に基づく適切な結果をフィールドに設定します。無効な文字が入力された場合は、ビープ音を鳴らします。
        e.Cancel = True
        Select Case UCase(e.KeyChar)
            Case "Y"
                .Value = -1
            Case "N"
                .Value = 0
            Case Else
                Beep()
        End Select
    End With
End Sub

C# コードの書き方

C#
コードのコピー
private void C1TrueDBGrid1_BeforeColEdit( object sender, C1.Win.C1TrueDBGrid.BeforeColEditEventArgs e) 
{
    C1.Win.C1DataColumn col = e.Column.DataColumn;
 
    // これが「Done」列でないか、ユーザーがマウスでクリックした場合は、そのまま続行します
    if (col.DataField != "Done" || e.KeyChar == 0 ) return;
 
    // 通常の編集をキャンセルし、KeyAscii に基づく適切な結果をフィールドに設定します。無効な文字が入力された場合は、ビープ音を鳴らします。
    e.Cancel = true;
    switch (e.KeyChar. .ToUpper()) 
    {
        case "Y";
            Col.Value = -1;
            break;
        case "N";
            Col.Value = 0;
        default:;
            Beep();
    }
}

KeyAscii が0の場合はイベントハンドラが終了します。したがって、マウスを使って編集することもできます。