セルの罫線をクリックしたとき、セルが選択されないのはなぜですか?

文書番号 : 40567     文書種別 : 使用方法     登録日 : 2017/07/26     最終更新日 : 2017/07/26
文書を印刷する
対象製品
MultiRow for Windows Forms 10.0J
詳細
MultiRow for Windows Forms 10.0Jでは、実行時にはセルの罫線部分が行の領域として扱われます。このため、セルの罫線をクリックしても現在のセルが移動したり、隣接するセルが選択されることはありません。この動作は、表示モード(GcMultiRow.ViewMode)やコンテキストメニューにも影響します。

セルの罫線のクリックをセル自体のクリックとして処理するには、次のようにコーディングします。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    GcMultiRow1.Template = Template.CreateGridTemplate(5, 50, 20)
    GcMultiRow1.RowCount = 5
    GcMultiRow1.DefaultCellStyle.Border = New Border(LineStyle.Thick, Color.DarkGray)

    GcMultiRow1.ViewMode = ViewMode.ListBox
End Sub

Private Sub GcMultiRow1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GcMultiRow1.MouseDown
    Dim gcMultiRow As GcMultiRow = TryCast(sender, GcMultiRow)
    Dim hitTestInfo1 As HitTestInfo = gcMultiRow.HitTest(e.Location)
    
    If gcMultiRow.ViewMode = ViewMode.Default Then
        Const maxWidth As Integer = 3
        If hitTestInfo1.Type = HitTestType.Row AndAlso hitTestInfo1.CellIndex = -1 Then
            Dim hitTestInfo2 As HitTestInfo = gcMultiRow.HitTest(e.X - maxWidth, e.Y - maxWidth)
            gcMultiRow.CurrentCellPosition = New CellPosition(hitTestInfo2.SectionIndex, hitTestInfo2.CellIndex)
        End If
    ElseIf gcMultiRow.ViewMode = ViewMode.Row Then
        If hitTestInfo1.Type = HitTestType.Row AndAlso hitTestInfo1.CellIndex = -1 Then
            gcMultiRow.CurrentCellPosition = New CellPosition(hitTestInfo1.SectionIndex, hitTestInfo1.CellIndex)
        End If
    ElseIf gcMultiRow.ViewMode = ViewMode.ListBox Then
        If hitTestInfo1.Type = HitTestType.Row AndAlso hitTestInfo1.CellIndex = -1 Then
            gcMultiRow.Rows(hitTestInfo1.SectionIndex).Selected = Not gcMultiRow.Rows(hitTestInfo1.SectionIndex).Selected
        End If
    End If
End Sub

[C#]
using GrapeCity.Win.MultiRow;

private void Form1_Load(object sender, EventArgs e)
{
    gcMultiRow1.Template = Template.CreateGridTemplate(5, 50, 20);

    gcMultiRow1.RowCount = 5;
    gcMultiRow1.DefaultCellStyle.Border = new Border(LineStyle.Thick, Color.DarkGray);
}

private void gcMultiRow1_MouseDown(object sender, MouseEventArgs e)
{
    GcMultiRow gcMultiRow = sender as GcMultiRow;
    HitTestInfo hitTestInfo1 = gcMultiRow.HitTest(e.Location);

    if (!checkBox1.Checked) return;

    if (gcMultiRow.ViewMode == ViewMode.Default)
    {
        const int maxWidth = 3;
        if (hitTestInfo1.Type == HitTestType.Row && hitTestInfo1.CellIndex == -1)
        {
            HitTestInfo hitTestInfo2 = gcMultiRow.HitTest(e.X - maxWidth, e.Y - maxWidth);
            
            gcMultiRow.CurrentCellPosition = new CellPosition(hitTestInfo2.SectionIndex, hitTestInfo2.CellIndex);
        }
    }
    else if (gcMultiRow.ViewMode == ViewMode.Row)
    {
        if (hitTestInfo1.Type == HitTestType.Row && hitTestInfo1.CellIndex == -1)
        {
            gcMultiRow.CurrentCellPosition = new CellPosition(hitTestInfo1.SectionIndex, gcMultiRow.CurrentCellPosition.CellIndex);
        }
    }
    else if (gcMultiRow.ViewMode == ViewMode.ListBox)
    {
        if (hitTestInfo1.Type == HitTestType.Row && hitTestInfo1.CellIndex == -1)
        {
            gcMultiRow.Rows[hitTestInfo1.SectionIndex].Selected = !gcMultiRow.Rows[hitTestInfo1.SectionIndex].Selected;
        }
    }
}

この例ではマウスクリックの操作と同時に現在のセルや行を移動しますが、セルの値を検証など、他の処理で移動を禁止している場合には例外が発生します。この場合、必要に応じてこの例外を破棄するコードを追加してください。