.NETプログラミング研究 第8号 †
.NET Tips †
今回も前回に引き続き、DataGridコントロール(System.Windows.Forms)に関するTipsを紹介します。「DataGridコントロールなんか使わないよ」という方には申し訳ありませんが(実は私もそうなのですが)、しばらくの間我慢してください。
DataGridの指定された座標位置の情報を取得する †
DataGridクラスのHitTestメソッドにより、指定された座標位置の情報(セル、ヘッダ、境界線、バックグランドなど)を取得することが出来ます。
次の例ではDataGrid1(DataGridオブジェクト)上でマウスボタンが押されたとき、その位置の情報を表示しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| | Private Sub DataGrid1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles DataGrid1.MouseDown
Dim grid As DataGrid = CType(sender, DataGrid)
Dim hti As System.Windows.Forms.DataGrid.HitTestInfo
hti = grid.HitTest(e.X, e.Y)
Select Case hti.Type
Case System.Windows.Forms.DataGrid.HitTestType.None
Console.WriteLine("バックグランドがクリックされました。")
Case System.Windows.Forms.DataGrid.HitTestType.Cell
Console.WriteLine("行{0}列{1}のセルがクリックされました。", _
hti.Row, hti.Column)
Case System.Windows.Forms.DataGrid.HitTestType.ColumnHeader
Console.WriteLine("列ヘッダ'{0}'がクリックされました。", _
hti.Column)
Case System.Windows.Forms.DataGrid.HitTestType.RowHeader
Console.WriteLine("行ヘッダ'{0}'がクリックされました。", _
hti.Row)
Case System.Windows.Forms.DataGrid.HitTestType.ColumnResize
Console.WriteLine("列'{0}'の境界線がクリックされました。", _
hti.Column)
Case System.Windows.Forms.DataGrid.HitTestType.RowResize
Console.WriteLine("行'{0}'の境界線がクリックされました。", _
hti.Row)
Case System.Windows.Forms.DataGrid.HitTestType.Caption
Console.WriteLine("キャプションがクリックされました。")
Case System.Windows.Forms.DataGrid.HitTestType.ParentRows
Console.WriteLine("親行セクションがクリックされました。")
End Select
End Sub
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| | private void DataGrid1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
DataGrid grid = (DataGrid) sender;
System.Windows.Forms.DataGrid.HitTestInfo hti;
hti = grid.HitTest(e.X, e.Y);
switch (hti.Type)
{
case System.Windows.Forms.DataGrid.HitTestType.None:
Console.WriteLine("バックグランドがクリックされました。");
break;
case System.Windows.Forms.DataGrid.HitTestType.Cell:
Console.WriteLine("行{0}列{1}のセルがクリックされました。",
hti.Row, hti.Column);
break;
case System.Windows.Forms.DataGrid.HitTestType.ColumnHeader:
Console.WriteLine("列ヘッダ'{0}'がクリックされました。",
hti.Column);
break;
case System.Windows.Forms.DataGrid.HitTestType.RowHeader:
Console.WriteLine("行ヘッダ'{0}'がクリックされました。",
hti.Row);
break;
case System.Windows.Forms.DataGrid.HitTestType.ColumnResize:
Console.WriteLine("列'{0}'の境界線がクリックされました。",
hti.Column);
break;
case System.Windows.Forms.DataGrid.HitTestType.RowResize:
Console.WriteLine("行'{0}'の境界線がクリックされました。",
hti.Row);
break;
case System.Windows.Forms.DataGrid.HitTestType.Caption:
Console.WriteLine("キャプションがクリックされました。");
break;
case System.Windows.Forms.DataGrid.HitTestType.ParentRows:
Console.WriteLine("親行セクションがクリックされました。");
break;
}
}
|
次にスクリーン座標を使った例として、現在のマウスポインタ位置からDataGridの情報を取得する方法を紹介します。スクリーン座標をクライアント座標に変換してからHitTestメソッドを使います。
1
2
3
4
5
6
7
| | Dim p As Point = DataGrid1.PointToClient(Cursor.Position)
Dim hti As System.Windows.Forms.DataGrid.HitTestInfo
hti = DataGrid1.HitTest(p)
Console.WriteLine(hti.ToString())
|
1
2
3
4
5
6
7
8
9
10
11
| | private void DataGrid1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
Point p = DataGrid1.PointToClient(Cursor.Position);
System.Windows.Forms.DataGrid.HitTestInfo hti;
hti = DataGrid1.HitTest(p);
Console.WriteLine(hti.ToString());
}
|
DataGridの行数を取得する †
例えばDataGridコントロールのDataSourceプロパティにDataTableオブジェクトが設定されており、そのDataTableの行数を取得するには次のようにすればよいでしょう。
1
2
3
| | Dim dt As DataTable = CType(DataGrid1.DataSource, DataTable)
Console.WriteLine(dt.Rows.Count)
|
1
2
3
| | DataTable dt = (DataTable) DataGrid1.DataSource;
Console.WriteLine(dt.Rows.Count);
|
しかしこれは、行のフィルタ処理がされているときなどでは、DataGridに実際に表示されている行数とは異なります。DataGridに実際に表示されている行数を取得するには、次のようにBindingManagerBaseクラスのCountプロパティを参照します。
1
2
3
4
5
| | Console.WriteLine( _
DataGrid1.BindingContext(DataGrid1.DataSource, _
DataGrid1.DataMember).Count _
)
|
1
2
3
4
5
| | Console.WriteLine(
DataGrid1.BindingContext[DataGrid1.DataSource,
DataGrid1.DataMember].Count
);
|
コメント †