アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2005、Flex Grid For.Net環境です。

ある列の最大値を求めたいと思っています。
例えば、

列A
----
1
12
15
30
21

このような列であれば、30を求めたいのです。
実際は降順に表示させて、一番上の行が最大値なので、盲目的に
一番上の値を取得していますが、降順でなくなると取得できないため、
ロジックでなんとかしたいと考えています。

できましたら、サンプルコード交えて教えていただけないでしょうか?
よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/11 16:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています