┏第8号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■.NET Tips ・DataGridの指定された座標位置の情報を取得する ・DataGridの行数を取得する 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■.NET Tips ─────────────────────────────── 今回も前回に引き続き、DataGridコントロール(System.Windows. Forms)に関するTipsを紹介します。「DataGridコントロールなんか使 わないよ」という方には申し訳ありませんが(実は私もそうなのです が)、しばらくの間我慢してください。 ─────────────────────────────── ●DataGridの指定された座標位置の情報を取得する DataGridクラスのHitTestメソッドにより、指定された座標位置の情報 (セル、ヘッダ、境界線、バックグランドなど)を取得することが出 来ます。 次の例ではDataGrid1(DataGridオブジェクト)上でマウスボタンが押さ れたとき、その位置の情報を表示しています。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'ここでは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 '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 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メソッドを使います。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'マウスポインタのスクリーン座標をクライアント座標に変換 Dim p As Point = DataGrid1.PointToClient(Cursor.Position) '座標位置の情報を取得 Dim hti As System.Windows.Forms.DataGrid.HitTestInfo hti = DataGrid1.HitTest(p) '結果を表示 Console.WriteLine(hti.ToString()) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 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の指定された座標位置の情報を取得する http://dobon.net/vb/dotnet/datagrid/hittest.html ─────────────────────────────── ●DataGridの行数を取得する 例えばDataGridコントロールのDataSourceプロパティにDataTableオブ ジェクトが設定されており、そのDataTableの行数を取得するには次の ようにすればよいでしょう。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'DataTableの行数の取得 Dim dt As DataTable = CType(DataGrid1.DataSource, DataTable) Console.WriteLine(dt.Rows.Count) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //DataTableの行数の取得 DataTable dt = (DataTable) DataGrid1.DataSource; Console.WriteLine(dt.Rows.Count); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ しかしこれは、行のフィルタ処理がされているときなどでは、 DataGridに実際に表示されている行数とは異なります。DataGridに実 際に表示されている行数を取得するには、次のように BindingManagerBaseクラスのCountプロパティを調べます。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'DataGridの行数の取得 Console.WriteLine( _ DataGrid1.BindingContext(DataGrid1.DataSource, _ DataGrid1.DataMember).Count _ ) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //DataGridの行数の取得 Console.WriteLine( DataGrid1.BindingContext[DataGrid1.DataSource, DataGrid1.DataMember].Count ); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・DataGridの行数を取得する http://dobon.net/vb/dotnet/datagrid/rowscount.html =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  http://dobon.net  dobon@bigfoot.com ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/bbs ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 DOBON! All rights reserved. ===============================