- - PR -
DataGridViewの列集計について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-11 11:57
Visuai Basic 2005 Exprese Edition でWindowsアプリケーションを開発しています。
DataGridView の数字列を縦に集計して表の下部に表示したいのですが、DataGridView にはそのような機能がなさそうなので、フォームのLoad時に次のように処理して、 非結合のTextBoxに表示させています。 1.For EachステートメントでDataTableの全レコードにアクセスして列を集計する。 2.集計した値をTextBoxで表示する。 質問したいことは、DataGridView を使う度にこのようにして集計表示していますが、 このような方法よりもスマートな方法がありましたらご教授いただきたくスレッドを 立てました。よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-10-11 12:58
スマートな方法は教えてもらうようなものではなく、自分で研究するものである。
…といった話はこっちへ置いといて。 私であれば、DataGridView の DataSource に DataTable を割り当てます。 そして DataTable に列を追加して、Expression に SUM(項目名) といった値を入れて おくでしょう。 あとは適宜 DataTable に追加した列の内容を取り出し、テキストボックスに設定 してあげればいいと思います。 コードで書くとこんな感じでしょうか。
ところで以前から思っていたのですが
開発環境ぐらいは正しく書いたほうがいいんじゃないでしょうか。 (いつも間違っているのでコピペなのかもしれませんが、そっちの方が悪印象を与えそうです) _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||
|
投稿日時: 2007-10-11 17:17
ぽぴ王子さん、ありがとうございました。
早速試してみます。 | ||||||||
|
投稿日時: 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 10:36
だんじりさん、すばらしいですね。
DataGridViewの縦集計は私も困っていました。新規登録や編集の機能を持たせたいなら 画面のどこかにボタンを配置して別のフォームでやればいいことです。このやり方で問題 なのは多くの行がある場合に最終行までスクロールさせなっければ見えないことですね。 合計行を1行目にすればよいか? | ||||||||
|
投稿日時: 2007-10-14 21:49
Integer でいいの?
「価額」という文字があるので尋ねます。Integer で足ります? http://blogs.wankuma.com/jitta/archive/2005/11/22/19516.aspx | ||||||||
|
投稿日時: 2007-10-15 08:36
未記入さん、ありがとうございます。
その通りですね。縦集計のあるフォームで新規登録や修正が要求される場合は、 別の専用フォームを設ければいいことですね。それとDataGridViewの表示に フィルターやソートを掛けている場合は、新規追加した合計行にもフィルター やソートに適応した設置をする必要がありますので注意下さい。 Jittaさん、ご指摘ありがとうございました。 ご指摘いただいた価額は会計の財務諸表などに記載する金額で、年間金額となれば Integer の21億円では不足する恐れがある、との指摘と解釈しました。 ただ、このソフトには年間取引1億円以下の条件がありまして、あえてInteger の 型設定としています。Jittaさん、ありがとうございました。 | ||||||||
|
投稿日時: 2007-10-16 06:29
提示した URL も併せて見ていただければ理解できると思って省略しました。ありがとうございます。 ところで、「年間取引1億円以下の条件」ということですが、私なら、この条件が顧客から出されたものなら、納得しません。個々の取引金額の上限と、年間、あるいは月間の取引数の上限があってはじめて、この条件を導き出します。 つまり、この「年間取引1億円以下」という条件は「顧客から提示される条件」ではなく、顧客から提示された条件を突き合わせた結果、「開発元から確認するべき条件」だと思います。 後者なら、読み流して下さい。前者なら、確認しておくことを提案します。 |