- PR -

DataGridViewの列集計について

投稿者投稿内容
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-11 11:57
Visuai Basic 2005 Exprese Edition でWindowsアプリケーションを開発しています。
DataGridView の数字列を縦に集計して表の下部に表示したいのですが、DataGridView
にはそのような機能がなさそうなので、フォームのLoad時に次のように処理して、
非結合のTextBoxに表示させています。
1.For EachステートメントでDataTableの全レコードにアクセスして列を集計する。
2.集計した値をTextBoxで表示する。

質問したいことは、DataGridView を使う度にこのようにして集計表示していますが、
このような方法よりもスマートな方法がありましたらご教授いただきたくスレッドを
立てました。よろしくお願いいたします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-10-11 12:58
スマートな方法は教えてもらうようなものではなく、自分で研究するものである。
…といった話はこっちへ置いといて。

私であれば、DataGridView の DataSource に DataTable を割り当てます。
そして DataTable に列を追加して、Expression に SUM(項目名) といった値を入れて
おくでしょう。
あとは適宜 DataTable に追加した列の内容を取り出し、テキストボックスに設定
してあげればいいと思います。

コードで書くとこんな感じでしょうか。

コード:

    Dim t As New DataTable()
    t.Columns.Add("AAA", GetType(String))
    t.Columns.Add("BBB", GetType(Integer))
    t.Columns.Add("CCC", GetType(Integer), "SUM(BBB)")
    t.AcceptChanges()

    t.Rows.Add("1", 10)
    t.Rows.Add("2", 20)
    t.Rows.Add("3", 30)
    t.AcceptChanges()

    DataGridView1.DataSource = t


ところで以前から思っていたのですが

引用:

Visuai Basic 2005 Exprese Edition でWindowsアプリケーションを開発しています。


開発環境ぐらいは正しく書いたほうがいいんじゃないでしょうか。
(いつも間違っているのでコピペなのかもしれませんが、そっちの方が悪印象を与えそうです)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-11 17:17
ぽぴ王子さん、ありがとうございました。
早速試してみます。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-12 16:02
「スマートな方法は教えてもらうようなものではなく、自分で研究するものである。」
との指摘を受けて、今後ともDataGridView の縦集計を表示することが多いと思い、
私なりにスマート(?)な方法を考えてみました。

DataGridViewの縦集計をして一覧表示したい状況は、新規レコードの追加や編集の要望
は既に少なく、一般的には分析や集計結果の閲覧することであると考えました。
Read OnlyプロパティをTrue、AllowUserToAddRowsプロパティをFalseとする条件さえ
満足できれば、合計表示用のTextBoxなど配列するこよなく、合計行をダイレクトに
DataTableの新規レコードとして追加し、この合計行を追加したDataTableをDataGridView
で表示すればスマートな合計行となるはずです。
以下、実際に試みたコードを連記しました。

Dim NN(14) As Integer
Dim dr As DataRow
For Each dr In abcDataSet.営業明細.Rows
NN(0) += dr("期首価額")
NN(1) += dr("月1額")
NN(2) += dr("月2額")
NN(3) += dr("月3額")
NN(4) += dr("月4額")
NN(5) += dr("月5額")
NN(6) += dr("月6額")
NN(7) += dr("月7額")
NN( += dr("月8額")
NN(9) += dr("月9額")
NN(10) += dr("月10額")
NN(11) += dr("月11額")
NN(12) += dr("月12額")
NN(13) += dr("当期合計額")
Next
Dim adr As abcDataSet.営業明細Row
adr = abcDataSet.営業明細.New営業明細Row
adr("名称") = "合 計"
adr("期首簿価") = NN(0)
adr("月1額") = NN(1)
adr("月2額") = NN(2)
adr("月3額") = NN(3)
adr("月4額") = NN(4)
adr("月5額") = NN(5)
adr("月6額") = NN(6)
adr("月7額") = NN(7)
adr("月8額") = NN(
adr("月9額") = NN(9)
adr("月10額") = NN(10)
adr("月11額") = NN(11)
adr("月12額") = NN(12)
adr("当期合計額") = NN(13)
abcDataSet.営業明細.Rows.Add(adr)

営業明細DataGridView.Rows(営業明細DataGridView.RowCount - 1). _
DefaultCellStyle.BackColor = Color.FromArgb(235, 234, 219)
'----Color.FromArgb(235, 234, 219)は合計行のMenuStripシステムカラー

営業明細DataGridView.AlternatingRowsDefaultCellStyle.BackColor = _
Color.FromArgb(200, 219, 255)
'--奇数行のセルの背景色

以上、参考になれば幸いです。









[ メッセージ編集済み 編集者: だんじり 編集日時 2007-10-12 16:41 ]

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-10-13 08:11 ]
未記入
会議室デビュー日: 2007/10/13
投稿数: 7
投稿日時: 2007-10-13 10:36
だんじりさん、すばらしいですね。
DataGridViewの縦集計は私も困っていました。新規登録や編集の機能を持たせたいなら
画面のどこかにボタンを配置して別のフォームでやればいいことです。このやり方で問題
なのは多くの行がある場合に最終行までスクロールさせなっければ見えないことですね。
合計行を1行目にすればよいか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-14 21:49
 Integer でいいの?
 「価額」という文字があるので尋ねます。Integer で足ります?
http://blogs.wankuma.com/jitta/archive/2005/11/22/19516.aspx
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-15 08:36
未記入さん、ありがとうございます。
その通りですね。縦集計のあるフォームで新規登録や修正が要求される場合は、
別の専用フォームを設ければいいことですね。それとDataGridViewの表示に
フィルターやソートを掛けている場合は、新規追加した合計行にもフィルター
やソートに適応した設置をする必要がありますので注意下さい。

Jittaさん、ご指摘ありがとうございました。
ご指摘いただいた価額は会計の財務諸表などに記載する金額で、年間金額となれば
Integer の21億円では不足する恐れがある、との指摘と解釈しました。
ただ、このソフトには年間取引1億円以下の条件がありまして、あえてInteger の
型設定としています。Jittaさん、ありがとうございました。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-16 06:29
引用:

年間金額となれば
Integer の21億円では不足する恐れがある、との指摘と解釈しました。


提示した URL も併せて見ていただければ理解できると思って省略しました。ありがとうございます。

 ところで、「年間取引1億円以下の条件」ということですが、私なら、この条件が顧客から出されたものなら、納得しません。個々の取引金額の上限と、年間、あるいは月間の取引数の上限があってはじめて、この条件を導き出します。
 つまり、この「年間取引1億円以下」という条件は「顧客から提示される条件」ではなく、顧客から提示された条件を突き合わせた結果、「開発元から確認するべき条件」だと思います。

 後者なら、読み流して下さい。前者なら、確認しておくことを提案します。

スキルアップ/キャリアアップ(JOB@IT)