[True DBGrid for WinForms] ColContainingメソッドの戻り値が左隣の列番号になることがある

文書番号 : 82460     文書種別 : Bug
登録日 : 2017/12/06     最終更新日 : 2017/12/06

対象製品

Studio for WinForms

ステータス

回避方法あり

詳細

列の境界線から1ピクセル右の位置でマウスクリックして、ColContaingメソッドで列を取得すると左隣の列番号を取得してしまいます。

回避方法

ColContainingメソッドの内部処理において、列の右端の位置をX+Widthで計算しているため本現象が発生しております。

下記サンプルコードのように、あらかじめ列の矩形を取得してマウスクリック時に位置が矩形の範囲内にあるか判定する独自処理を実装することで、現象の回避が可能です。

◎サンプルコード(VB)
Public Class Form1

  Dim rectList As New List(Of Rectangle)
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' データの作成
    Dim dt As New DataTable
    dt.Columns.Add("ColA", GetType(String))
    dt.Columns.Add("ColB", GetType(String))
    For i As Integer = 0 To 9
      dt.Rows.Add(String.Format("A{0}", i), String.Format("B{0}", i))
    Next
    dt.AcceptChanges()

    ' TrueDBGridの設定
    C1TrueDBGrid1.DataSource = dt
    C1TrueDBGrid1.Splits(0).DisplayColumns(1).Style.BackColor = Color.Aquamarine

    ' 各列の矩形を取得
    For i As Integer = 0 To C1TrueDBGrid1.Splits(0).DisplayColumns.Count - 1
      rectList.Add(C1TrueDBGrid1.Splits(0).GetCellBounds(0, i))
    Next

  End Sub

  Private Sub C1TrueDBGrid1_MouseClick1(sender As Object, e As MouseEventArgs) Handles C1TrueDBGrid1.MouseClick

    ' クリック位置から列を取得する
    Dim col As Integer = getCol(e.Location)

    MessageBox.Show(col & "列目")

  End Sub
  Private Function getCol(e As System.Drawing.Point) As Integer

    '範囲外の場合、-1 を返す
    Dim result As Integer = -1

    ' マウスポイント位置が矩形の範囲内か判定する
    For i As Integer = 0 To rectList.Count - 1
      If rectList(i).X <= e.X And rectList(i).X + rectList(i).Width > e.X Then
        result = i
      End If
    Next

    Return result

  End Function

End Class


◎サンプルコード(C#)
public Form1()
    {
      InitializeComponent();
    }
    List rectList = new List();
    private void Form1_Load(object sender, EventArgs e)
    {
      // データの作成
      DataTable dt = new DataTable();
      dt.Columns.Add("ColA", typeof(String));
      dt.Columns.Add("ColB", typeof(String));

      for (int i = 0; i <= 9; i++)
      {
        dt.Rows.Add(String.Format("A{0}", i), String.Format("B{0}", i));
      }
      dt.AcceptChanges();

      // TrueDBGridの設定
      c1TrueDBGrid1.DataSource = dt;
      c1TrueDBGrid1.Splits[0].DisplayColumns[1].Style.BackColor = Color.Aquamarine;

      // 各列の矩形を取得
      for (int i = 0; i <= c1TrueDBGrid1.Splits[0].DisplayColumns.Count - 1; i++)
      {
        rectList.Add(c1TrueDBGrid1.Splits[0].GetCellBounds(0, i));
      }
    }

    private void c1TrueDBGrid1_MouseClick(object sender, MouseEventArgs e)
    {
      int col = getCol(e.Location);

      MessageBox.Show(col + "列目");
    }

    private int getCol(System.Drawing.Point e)
    {
      // 範囲外の場合、-1 を返す
      int result = -1;

      // マウスポイント位置が矩形の範囲内か判定する
      for (int i = 0; i <= rectList.Count-1; i++)
      {
        if (rectList[i].X <= e.X && rectList[i].X + rectList[i].Width > e.X)
        {
          result = i;
        }
      }

      return result;
    }