• ベストアンサー

グリッドの列の最大値を求めたい。

VB2005、Flex Grid For.Net環境です。 ある列の最大値を求めたいと思っています。 例えば、 列A ---- 1 12 15 30 21 このような列であれば、30を求めたいのです。 実際は降順に表示させて、一番上の行が最大値なので、盲目的に 一番上の値を取得していますが、降順でなくなると取得できないため、 ロジックでなんとかしたいと考えています。 できましたら、サンプルコード交えて教えていただけないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

ginfix
質問者

お礼

お返事が遅れまして大変申し訳ありません。 教えていただいたコードを参考に、目的の動作を完成 させることができました。 ありがとうございました。

関連するQ&A