MESCIUS MultiRow for Windows Forms 12.0J
セルの編集

GcMultiRowコントロールの既定の設定では、ユーザーは市販の表計算アプリケーションと同じようにセルの編集や、編集結果の確定、キャンセルを実行できます。ここでは、GcMultiRowコントロールがサポートするさまざまな編集開始方法について説明します。
ユーザーによる編集
既定の設定では、ユーザーは次のいずれかの方法でセルの編集を開始できます。

  • セルのダブルクリック
  • 文字キーの入力
  • [Enter]キーの入力
  • [F2]キーの入力

ユーザーがどの方法でセルの編集を開始したかどうかを検出するには、GcMultiRow.CellBeginEditイベントで CellBeginEditEventArgs.BeginEditReasonプロパティの値を確認します。

セルの編集結果を確定するには、次のいずれかの操作を行います。

  • [Enter]キーの入力
  • 編集中のセルから移動する

ユーザーがどの方法でセルの編集を終了したかどうかを検出するには、GcMultiRow.CellEndEditイベントで CellEndEditEventArgs.EndEditReasonプロパティの値を確認します。

セルの編集結果をキャンセル(破棄)するには、次の操作を行います。

  • [Esc]キーの入力

編集結果がキャンセルされたかどうかを検出するには、GcMultiRow.CellEndEditイベントでCellEndEditEventArgs.EditCanceledプロパティの値を確認します。

単独のキーに割り当てられたアクションは、ショートカットキーとして実装されています。開発者は、ショートカットキーの機能を通してこれらのキーやアクションを変更できます。ショートカットキーのカスタマイズについては、「ショートカットキー」を参照してください。

文字キーの入力やダブルクリックによる編集の開始は、GcMultiRow.EditModeプロパティがEditOnKeystrokeOrShortcutKeyのときの組み込みのアクションです。
これらを無効にするには、GcMultiRow.EditModeプロパティの値を変更します。
コーディングによる編集
開発者はショートカット キーの設定に関係なく、セルの編集を開始できます。

GcMultiRow1.Focus()
GcMultiRow1.BeginEdit(False)
gcMultiRow1.Focus();
gcMultiRow1.BeginEdit(false);

ただし、グリッドが表示専用モードであったり、セルが読み取り専用の場合、編集をサポートしていない場合はセルの編集を開始することはできません。

編集結果の確定にはGcMultiRow.EndEditメソッドを使用します。編集結果のキャンセルにはGcMultiRow.CancelEditメソッドを使用します。編集結果を明示的にデータソースに反映(コミット)するにはGcMultiRow.CommitEditメソッドを使用します。

開発者はショートカット キーのアクションを直接実行してセルの編集を開始することもできます。

GcMultiRow1.Focus()
GrapeCity.Win.MultiRow.EditingActions.BeginEdit.Execute(GcMultiRow1)
gcMultiRow1.Focus();
GrapeCity.Win.MultiRow.EditingActions.BeginEdit.Execute(gcMultiRow1);

GcMultiRow.BeginEditメソッドで編集を開始した場合、GcMultiRow.CellBeginEditイベントの CellBeginEditEventArgs.BeginEditReasonプロパティの値はProgrammaticallyとなり、開発者による編集であることを確認できます。一方、ショートカット キーのアクションを実行した場合は、CellBeginEditEventArgs.BeginEditReasonプロパティの値はShortcutKeyとなります。コードによる実行と、ユーザー操作のシミュレートがそれぞれ区別されることがわかります。
常時入力または自動編集
セルに移動した直後に自動的に編集を開始する機能は、常時入力モードとしてグリッドに提供されています。

GcMultiRow1.EditMode = GrapeCity.Win.MultiRow.EditMode.EditOnEnter
gcMultiRow1.EditMode = GrapeCity.Win.MultiRow.EditMode.EditOnEnter;

常時入力モードによる編集結果は、[Enter]キーの入力またはセルの移動によって確定します。
編集開始時にテキストを選択
HighlightTextプロパティをTrueに設定すると、セルが編集モードになったときに設定されているテキストが選択状態になります。

次のコードは、TextBoxCell.HighlightTextプロパティを使用して、文字列型セルの編集開始時にテキストを選択状態にします。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim TextBoxCell1 As New TextBoxCell()
    TextBoxCell1.HighlightText = True
    TextBoxCell1.Value = "Hello"

    GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {TextBoxCell1})
    GcMultiRow1.RowCount = 3
End Sub
private void Form1_Load(object sender, EventArgs e)
{
    TextBoxCell textBoxCell1 = new TextBoxCell();
    textBoxCell1.HighlightText = true;
    textBoxCell1.Value = "Hello";

    gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { textBoxCell1 });
    gcMultiRow1.RowCount = 3;
}
編集のキャンセル
GcMultiRow.CellBeginEditイベントのCellBeginEditEventArgs.Cancelプロパティ(System.ComponentModel.CancelEventArgs.Cancelプロパティ)を使用すると、セルが編集モードに入るかどうかを制御できます。たとえば、セルの値に応じて編集を許可するかどうかを指定できます。
編集の禁止
テンプレートを設計する段階でセルの編集を許可しないことが明らかである場合、セルの選択禁止、イベント無効または読み取り専用によって実質的に編集を禁止できます。詳細は次のページを参照してください。


これらのプロパティの値は実行時に切り替えることもできます。
編集状態の取得
セルが編集状態であるかどうかは、GcMultiRow.IsCurrentCellInEditModeプロパティまたはCell.IsInEditModeプロパティで取得できます。
編集中のコントロール
編集中のセルには、セル編集コントロールが表示されます。たとえば、TextBoxCellの場合はTextBoxEditingControlが対応します。
セル編集コントロールには、GcMultiRow.EditingControlプロパティやGcMultiRow.EditingControlShowingイベントを通してアクセスできます。

次のコードは、編集確定時にセルの編集前の値と編集中の値を比較します。

Imports GrapeCity.Win.MultiRow

Private Sub GcMultiRow1_CellValidating(ByVal sender As System.Object, _
    ByVal e As CellValidatingEventArgs) Handles GcMultiRow1.CellValidating
    If TypeOf GcMultiRow1.CurrentCell Is TextBoxCell Then
        Dim beforeEdit As Object = _
            GcMultiRow1.Rows(e.RowIndex).Cells(e.CellIndex).Value
        If beforeEdit IsNot Nothing Then
            Console.WriteLine("編集前の値:{0}", beforeEdit.ToString())
        Else
            Console.WriteLine("編集前の値:(なし)")
        End If

        If GcMultiRow1.EditingControl IsNot Nothing Then
            Console.WriteLine("編集中の値:{0}", GcMultiRow1.EditingControl.Text)
        Else
            Console.WriteLine("編集中の値:(なし)")
        End If
    Else
        Console.WriteLine("現在のセルは文字列型ではありません")
    End If
End Sub
using GrapeCity.Win.MultiRow;

private void gcMultiRow1_CellValidating(object sender, CellValidatingEventArgs e)
{
    if (gcMultiRow1.CurrentCell is TextBoxCell)
    {
        object beforeEdit = gcMultiRow1.Rows[e.RowIndex].Cells[e.CellIndex].Value;
        if (beforeEdit != null)
            Console.WriteLine("編集前の値:{0}", beforeEdit.ToString());
        else
            Console.WriteLine("編集前の値:(なし)");

        if (gcMultiRow1.EditingControl != null)
            Console.WriteLine("編集中の値:{0}", gcMultiRow1.EditingControl.Text);
        else
            Console.WriteLine("編集中の値:(なし)");
    }
    else
    {
        Console.WriteLine("現在のセルは文字列型ではありません");
    }
}

次のコードは、編集時のみ文字色と背景色を変更します。

Imports GrapeCity.Win.MultiRow
Private Sub GcMultiRow1_EditingControlShowing(ByVal sender As System.Object, ByVal e As EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
    e.CellStyle.BackColor = Color.Azure
    e.CellStyle.ForeColor = Color.Blue
End Sub
using GrapeCity.Win.MultiRow;

private void gcMultiRow1_EditingControlShowing(object sender, EditingControlShowingEventArgs e)
{
    e.CellStyle.BackColor = Color.Azure;
    e.CellStyle.ForeColor = Color.Blue;
}
編集中のコントロールの編集禁止
セル編集コントロールのReadOnlyプロパティをTrueに設定することで、セルの内容の選択およびコピーを可能にして、編集を禁止することができます。
セル編集コントロールの編集を禁止するには、GcMultiRow.EditingControlShowingイベントを使用します。

次のコードは、一部のセルのセル編集コントロールのReadOnlyプロパティをTrueに設定して編集を禁止しています。

Imports GrapeCity.Win.MultiRow

Private Sub GcMultiRow1_EditingControlShowing(ByVal sender As Object, ByVal e As EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
    If GcMultiRow1.CurrentCellPosition.CellName = "textBoxCell1" Then
        DirectCast(e.Control, TextBoxEditingControl).ReadOnly = True
    Else
        DirectCast(e.Control, TextBoxEditingControl).ReadOnly = False
    End If
End Sub
using GrapeCity.Win.MultiRow;

private void gcMultiRow1_EditingControlShowing(object sender, EditingControlShowingEventArgs e)
{
    if (gcMultiRow1.CurrentCellPosition.CellName == "textBoxCell1")
    {
        (e.Control as TextBoxEditingControl).ReadOnly = true;
    }
    else
    {
        (e.Control as TextBoxEditingControl).ReadOnly = false;
    }
}
   
関連トピック

 

 


© MESCIUS inc. All rights reserved.