#title(8) #navi(.NETプログラミング研究) #contents *.NETプログラミング研究 第8号 [#mac4f7c5] **.NET Tips [#z4e9152f] 今回も前回に引き続き、DataGridコントロール(System.Windows.Forms)に関するTipsを紹介します。「DataGridコントロールなんか使わないよ」という方には申し訳ありませんが(実は私もそうなのですが)、しばらくの間我慢してください。 ***DataGridの指定された座標位置の情報を取得する [#h876ff39] #column(注意){{ この記事の最新版は「[[DataGridの指定された座標位置の情報を取得する>http://dobon.net/vb/dotnet/datagrid/hittest.html]]」で公開しています。 }} DataGridクラスのHitTestメソッドにより、指定された座標位置の情報(セル、ヘッダ、境界線、バックグランドなど)を取得することが出来ます。 次の例ではDataGrid1(DataGridオブジェクト)上でマウスボタンが押されたとき、その位置の情報を表示しています。 #code(vbnet){{ 'ここでは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 }} #code(csharp){{ 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メソッドを使います。 #code(vbnet){{ 'マウスポインタのスクリーン座標をクライアント座標に変換 Dim p As Point = DataGrid1.PointToClient(Cursor.Position) '座標位置の情報を取得 Dim hti As System.Windows.Forms.DataGrid.HitTestInfo hti = DataGrid1.HitTest(p) '結果を表示 Console.WriteLine(hti.ToString()) }} #code(csharp){{ 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の行数を取得する [#u7600cc4] #column(注意){{ この記事の最新版は「[[DataGridの行数を取得する>http://dobon.net/vb/dotnet/datagrid/rowscount.html]]」で公開しています。 }} 例えばDataGridコントロールのDataSourceプロパティにDataTableオブジェクトが設定されており、そのDataTableの行数を取得するには次のようにすればよいでしょう。 #code(vbnet){{ 'DataTableの行数の取得 Dim dt As DataTable = CType(DataGrid1.DataSource, DataTable) Console.WriteLine(dt.Rows.Count) }} #code(csharp){{ //DataTableの行数の取得 DataTable dt = (DataTable) DataGrid1.DataSource; Console.WriteLine(dt.Rows.Count); }} しかしこれは、行のフィルタ処理がされているときなどでは、DataGridに実際に表示されている行数とは異なります。DataGridに実際に表示されている行数を取得するには、次のようにBindingManagerBaseクラスのCountプロパティを参照します。 #code(vbnet){{ 'DataGridの行数の取得 Console.WriteLine( _ DataGrid1.BindingContext(DataGrid1.DataSource, _ DataGrid1.DataMember).Count _ ) }} #code(csharp){{ //DataGridの行数の取得 Console.WriteLine( DataGrid1.BindingContext[DataGrid1.DataSource, DataGrid1.DataMember].Count ); }} **コメント [#k1351e86] #comment //これより下は編集しないでください #pageinfo([[:Category/.NET]],2003-05-19 (月) 06:00:00,DOBON!,2010-03-20 (土) 02:34:43,DOBON!) |