.NETプログラミング研究 第8号

.NET Tips

今回も前回に引き続き、DataGridコントロール(System.Windows.Forms)に関するTipsを紹介します。「DataGridコントロールなんか使わないよ」という方には申し訳ありませんが(実は私もそうなのですが)、しばらくの間我慢してください。

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
'ここではMouseDownでクリックされたとする
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の行数を取得する」で公開しています。

例えばDataGridコントロールのDataSourceプロパティにDataTableオブジェクトが設定されており、そのDataTableの行数を取得するには次のようにすればよいでしょう。

  1
  2
  3
'DataTableの行数の取得
Dim dt As DataTable = CType(DataGrid1.DataSource, DataTable)
Console.WriteLine(dt.Rows.Count)
  1
  2
  3
//DataTableの行数の取得
DataTable dt = (DataTable) DataGrid1.DataSource;
Console.WriteLine(dt.Rows.Count);

しかしこれは、行のフィルタ処理がされているときなどでは、DataGridに実際に表示されている行数とは異なります。DataGridに実際に表示されている行数を取得するには、次のようにBindingManagerBaseクラスのCountプロパティを参照します。

  1
  2
  3
  4
  5
'DataGridの行数の取得
Console.WriteLine( _
    DataGrid1.BindingContext(DataGrid1.DataSource, _
        DataGrid1.DataMember).Count _
    )
  1
  2
  3
  4
  5
//DataGridの行数の取得
Console.WriteLine(
    DataGrid1.BindingContext[DataGrid1.DataSource,
        DataGrid1.DataMember].Count
    );

コメント



ページ情報
  • カテゴリ : .NET
  • 作成日 : 2003-05-19 (月) 06:00:00
  • 作成者 : DOBON!
  • 最終編集日 : 2010-03-20 (土) 02:34:43
  • 最終編集者 : DOBON!
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]