- ベストアンサー
グリッドの列の最大値を求めたい。
VB2005、Flex Grid For.Net環境です。 ある列の最大値を求めたいと思っています。 例えば、 列A ---- 1 12 15 30 21 このような列であれば、30を求めたいのです。 実際は降順に表示させて、一番上の行が最大値なので、盲目的に 一番上の値を取得していますが、降順でなくなると取得できないため、 ロジックでなんとかしたいと考えています。 できましたら、サンプルコード交えて教えていただけないでしょうか? よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
お世話になります。 DataTable 等をバインドしているのであれば、 DataTable.Select("条件", "ソートする列") の 一番最後の行オブジェクトを取得すれば最大値がとれるはずです。 FlexGrid を使ったのが初めてなので効率があまりよくないかもしれないですが バインドしていない方は、For 文で FlexGrid の行をがーっとまわして 最大値を取得しています。 以下のコードは、Form10 を作成して、デザイナでは何も手を加えず Load のイベントですべてのコントロールやイベントの設定を行っています。 各 TabPage に存在する FlexGrid を ダブルクリックすると 最大値をメッセージ表示します。 Public Class Form10 Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Controls.Clear() Dim tab As TabControl = New TabControl() tab.TabPages.Clear() tab.Dock = DockStyle.Fill Me.Controls.Add(tab) '' データバインドする場合 Dim tabPage1 As TabPage = New TabPage("DataBind") Dim flex1 As C1.Win.C1FlexGrid.C1FlexGrid = New C1.Win.C1FlexGrid.C1FlexGrid() flex1.Dock = DockStyle.Fill ' Data Bind flex1.DataSource = Me.CreateData() ' Double Click した時のイベントを登録 AddHandler flex1.DoubleClick, AddressOf flex1_DoubleClick tabPage1.Controls.Add(flex1) tab.TabPages.Add(tabpage1) '' データバインドしない場合 Dim tabPage2 As TabPage = New TabPage("not DataBind") Dim flex2 As C1.Win.C1FlexGrid.C1FlexGrid = New C1.Win.C1FlexGrid.C1FlexGrid() flex2.Dock = DockStyle.Fill ' not Data Bind Dim dt As DataTable = Me.CreateData() flex2.Item(0, 1) = dt.Columns(0).ColumnName flex2.Cols.Item(1).Name = dt.Columns(0).ColumnName flex2.Cols.Item(1).DataType = GetType(Integer) For index As Integer = 0 To dt.Rows.Count - 1 flex2.Item(index + 1, 1) = dt.Rows(index)(0) Next ' Double Click した時のイベントを登録 AddHandler flex2.DoubleClick, AddressOf flex2_DoubleClick tabPage2.Controls.Add(flex2) tab.TabPages.Add(tabpage2) End Sub '' データバインドしている場合の最大値をメッセージ表示 Private Sub flex1_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Dim flex As C1.Win.C1FlexGrid.C1FlexGrid = DirectCast(sender, C1.Win.C1FlexGrid.C1FlexGrid) Dim dt As DataTable = DirectCast(flex.DataSource, DataTable) Dim maxRow As DataRow = dt.Select("", "Column1")(dt.Rows.Count - 1) MessageBox.Show(maxRow("Column1").ToString()) End Sub '' データバインドしていない場合の最大値をメッセージ表示 Private Sub flex2_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Dim flex As C1.Win.C1FlexGrid.C1FlexGrid = DirectCast(sender, C1.Win.C1FlexGrid.C1FlexGrid) Dim max As Integer = 0 For index As Integer = 1 To flex.Rows.Count - 1 Dim value As Integer = CInt(flex.Item(index, 1)) If max < value Then max = value Next MessageBox.Show(max.ToString()) End Sub Private Function CreateData() As DataTable Dim dt As DataTable = New DataTable("test") dt.Columns.Add("Column1", GetType(Integer)) dt.Rows.Add(1) dt.Rows.Add(12) dt.Rows.Add(15) dt.Rows.Add(30) dt.Rows.Add(21) Return dt End Function End Class
お礼
お返事が遅れまして大変申し訳ありません。 教えていただいたコードを参考に、目的の動作を完成 させることができました。 ありがとうございました。