作成日: 2017/12/06 最終更新日: 2017/12/06
文書種別
不具合
状況
回避方法あり
詳細
列の境界線から1ピクセル右の位置でマウスクリックして、ColContaingメソッドで列を取得すると左隣の列番号を取得してしまいます。
回避方法
ColContainingメソッドの内部処理において、列の右端の位置をX+Widthで計算しているため本現象が発生しております。
下記サンプルコードのように、あらかじめ列の矩形を取得してマウスクリック時に位置が矩形の範囲内にあるか判定する独自処理を実装することで、現象の回避が可能です。
◎サンプルコード(VB)
◎サンプルコード(C#)
下記サンプルコードのように、あらかじめ列の矩形を取得してマウスクリック時に位置が矩形の範囲内にあるか判定する独自処理を実装することで、現象の回避が可能です。
◎サンプルコード(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
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;
}
{
InitializeComponent();
}
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;
}
旧文書番号
82460