C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: tableRowへのCellの追加について


(過去ログ 126 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■75197 / inTopicNo.1)  tableRowへのCellの追加について
  
□投稿者/ mura (5回)-(2015/03/05(Thu) 17:19:52)

分類:[.NET 全般] 

VisualStudio 2008 で、VBでのAsp.netの開発をしています。

※これまでVisualBasic6時代のフォームアプリケーションの開発経験しかなく、
 .net的な考え方に慣れておらず初歩的な質問かもしれませんがよろしくお願いします

テーブルコントロールに、動的に行・セルを追加していきたいのですが、
MSDNによると下のようなコードがありました。

   For rowCtr = 1 To rowCnt
      Dim tRow As New TableRow()
      For cellCtr = 1 To cellCnt
         Dim tCell As New TableCell()
         tCell.Text = "Row " & rowCtr & ", Cell " & cellCtr
         tRow.Cells.Add(tCell)
      Next
      Table1.Rows.Add(tRow)
   Next

この例は横方向への繰り返し内容が同じような内容なのでこれでよいのでしょうが、
例えばセルが3つあり、1セル目に3月1日からの日付、2セル目に曜日、3セル目に
休みかどうかの区分を表示したい、と考え以下のようにしました。

        For rowCtr = 1 To rowCnt
            Dim tRow As New TableRow()
            For cellCtr = 1 To cellCnt
                Dim tCell As New TableCell()
                Select Case cellCtr
                    Case 1
                        tCell.Text = DateAdd("d", rowCnt - 1, "2015/3/1")
                    Case 2
                        tCell.Text = Choose(Weekday(DateAdd("d", rowCnt - 1, "2015/3/1")), "日", "月", "火", "水", "木", "金", "土")
                    Case 3
                        If Weekday(DateAdd("d", rowCnt - 1, "2015/3/1")) = 1 Or Weekday(DateAdd("d", rowCnt - 1, "2015/3/1")) = 7 Then
                            tCell.Text = "休み"
                        Else
                            tCell.Text = "平日"
                        End If
                End Select
                tRow.Cells.Add(tCell)
            Next
            Table1.Rows.Add(tRow)
        Next

しかしこの方法では、セルが増えたらCaseを追加しなければなりませんし、また
途中に別なセルを挿入したくなった場合など、「Case XX」の部分を直さなければ
ならず、効率がよくありません。
そこで、内側のForやSelectを使わずに書きたいのですが、うまくいきません。
理想としては下のような感じです。

        Dim datHiduke As Date
        Dim intWeekDay As Integer

        For rowCtr = 1 To rowCnt
            Dim tRow As New TableRow()
            Dim tCell As New TableCell()

            '日付
            datHiduke = DateAdd("d", rowCnt - 1, "2015/3/1")
            tCell.Text = Format$(datHiduke, "yyyy/MM/dd")
            tRow.Cells.Add(tCell)
            '曜日
            intWeekDay = Weekday(datHiduke)
            tCell.Text = Choose(intWeekDay, "日", "月", "火", "水", "木", "金", "土")
            tRow.Cells.Add(tCell)
            '休み区分
            If intWeekDay = 1 Or intWeekDay = 7 Then
                tCell.Text = "休み"
            Else
                tCell.Text = "平日"
            End If
            tRow.Cells.Add(tCell)
        Next
        Table1.Rows.Add(tRow)

しかし、この方法では最後のセル(平日)しか追加されません。
tCellが1個しかないからなのか?と思い以下のようにしたところ、

            '日付
            Dim tCell As New TableCell()
            datHiduke = DateAdd("d", rowCnt - 1, "2015/3/1")
            tCell.Text = Format$(datHiduke, "yyyy/MM/dd")
            tRow.Cells.Add(tCell)
            '曜日
            Dim tCell As New TableCell()
            intWeekDay = Weekday(datHiduke)
            tCell.Text = Choose(intWeekDay, "日", "月", "火", "水", "木", "金", "土")
            tRow.Cells.Add(tCell)
            '休み区分
            Dim tCell As New TableCell()
            If intWeekDay = 1 Or intWeekDay = 7 Then
                tCell.Text = "休み"
            Else
                tCell.Text = "平日"
            End If
            tRow.Cells.Add(tCell)

「tCellはすでに存在しています」と怒られてしまいます。
For〜Nextで回すのだと何度Dimしてもいいのに、なぜこれではダメなのかというのも疑問点です。

Cellの追加をForで回さずに行うとしたら、どのような方法が一番いいのでしょうか。
よろしくお願いします。

引用返信 編集キー/
■75199 / inTopicNo.2)  Re[1]: tableRowへのCellの追加について
□投稿者/ shu (715回)-(2015/03/05(Thu) 17:36:24)
No75197 (mura さん) に返信
>
> 「tCellはすでに存在しています」と怒られてしまいます。
> For〜Nextで回すのだと何度Dimしてもいいのに、なぜこれではダメなのかというのも疑問点です。
>
コード記述時に表示される内容ですかね?


>Dim tCell As New TableCell()
Dim tCell As TableCell
の記述を処理の始めに追加して
後は
tCell = New TableCell()
の記述に変更すればそのエラーはなくなると思います。
引用返信 編集キー/
■75200 / inTopicNo.3)  Re[1]: tableRowへのCellの追加について
□投稿者/ WebSurfer (510回)-(2015/03/05(Thu) 17:43:16)
No75197 (mura さん) に返信

直接の回答ではなくてすみません。

> テーブルコントロールに、動的に行・セルを追加していきたいのですが、

よろしければ、そのようなことをする理由・背景・全体的なシナリオな
どを教えていただけませんか?

何らかのデータソース(SQL Server, Excel, CSV, XML など)があって、
それを表(html の table, tr, th、td など)で表示したいということ
でしたら、それなりのサーバーコントロールがいろいろ用意されていて、
自力でコードを書いて table を動的に組み立てる必要はまずないはずで
す。

もし、既存のサーバーコントロールを使ってやりたいことがより簡単に
できるのであれば、そちらの方向に進んだ方がよさそうな気がしますの
で、お聞きしています。
引用返信 編集キー/
■75201 / inTopicNo.4)  Re[2]: tableRowへのCellの追加について
□投稿者/ mura (6回)-(2015/03/05(Thu) 19:00:00)
WebSurfer様

早速の返信ありがとうございます。前回もお世話になりました。
今回も、教えていただいた方法でうまくいきました。
度々ありがとうございます。

今回実現したいことですが、データベースからデータを読み込んで
一覧に表示するというものです。

イメージとしては、下の例のように見出し(タイトル行)が複数行にわたっています。
_______________________________________
|    |      勤務時間     |   休憩時間  |  残業時間    ・・・
| |--------------------------------------------------------------------
| 日付 | 開始 | 終了 |   警告   | 開始 | 終了 |時間| 開始 | 終了 |
| | | |----------------| | | | | |
|    | | |区分| 内容 | | | | | |   ←ここまで見出し
------------------------------------------------------------------------------
| 3/1 | 9:30 |18:00 | 1 |遅刻 |12:00 |13:00 |60m | | |   ←ここからがデータ
| 3/2 | 9:00 |18:00 | | |12:00 |13:00 |60m | | |


そこで、tableの見出しの部分だけを予めaspページに設定しておき、コード内で
データベースを読んで行を追加していくということで考えました。
また、表示するデータ内容も、データベースの中身をそのまま表示するのでなく、
他の設定や項目によって変わる可能性があります。
(60mでなく"1時間"だったり"1H"になったりするなど)。
コードでデータベースを読み込んで追加していけば、表示する内容もいろいろ対応できる
のでこの方法で考えました。

ただし、この方法もあまりうまくいかないことがわかりました
(画面を初期化するためにtable.rows.clearとすると、見出しまで消えてしまう。)


データグリッドというのもあるようですが、タイトルが1行分しかなく、またデータソースや
バインドといった仕組みもなんだかよく飲み込めなかったので、自分の分かりやすい方法でやってみました。
この方法であれば、レコードを読みながらコードで判定したり編集したりといった柔軟性もあって
良いと思ったのですが…。

引用返信 編集キー/
■75202 / inTopicNo.5)  Re[3]: tableRowへのCellの追加について
□投稿者/ mura (7回)-(2015/03/05(Thu) 19:00:34)
No75201 (mura さん) に返信
> WebSurfer様
> 
> 早速の返信ありがとうございます。前回もお世話になりました。
> 今回も、教えていただいた方法でうまくいきました。
> 度々ありがとうございます。
> 
> 今回実現したいことですが、データベースからデータを読み込んで
> 一覧に表示するというものです。
> 
> イメージとしては、下の例のように見出し(タイトル行)が複数行にわたっています。
> _______________________________________
> |    |      勤務時間     |   休憩時間  |  残業時間    ・・・
> |        |--------------------------------------------------------------------
> | 日付 | 開始 | 終了 |   警告   | 開始 | 終了 |時間| 開始 | 終了 |
> |        |      |      |----------------|      |      |    |      |      |
> |    |      |      |区分|   内容    |      |      |    |      |      |   ←ここまで見出し
> ------------------------------------------------------------------------------
> |  3/1   | 9:30 |18:00 |  1 |遅刻       |12:00 |13:00 |60m |      |      |   ←ここからがデータ
> |  3/2   | 9:00 |18:00 |    |           |12:00 |13:00 |60m |      |      |
> 
> 
> そこで、tableの見出しの部分だけを予めaspページに設定しておき、コード内で
> データベースを読んで行を追加していくということで考えました。
> また、表示するデータ内容も、データベースの中身をそのまま表示するのでなく、
> 他の設定や項目によって変わる可能性があります。
> (60mでなく"1時間"だったり"1H"になったりするなど)。
> コードでデータベースを読み込んで追加していけば、表示する内容もいろいろ対応できる
> のでこの方法で考えました。
> 
> ただし、この方法もあまりうまくいかないことがわかりました
> (画面を初期化するためにtable.rows.clearとすると、見出しまで消えてしまう。)
> 
> 
> データグリッドというのもあるようですが、タイトルが1行分しかなく、またデータソースや
> バインドといった仕組みもなんだかよく飲み込めなかったので、自分の分かりやすい方法でやってみました。
> この方法であれば、レコードを読みながらコードで判定したり編集したりといった柔軟性もあって
> 良いと思ったのですが…。
> 

引用返信 編集キー/
■75203 / inTopicNo.6)  Re[4]: tableRowへのCellの追加について
□投稿者/ mura (8回)-(2015/03/05(Thu) 19:02:07)
すみません、ずれたので送信しなおしたらおかしくなってしまいました。
75201は無視してください。
引用返信 編集キー/
■75204 / inTopicNo.7)  Re[3]: tableRowへのCellの追加について
□投稿者/ WebSurfer (511回)-(2015/03/05(Thu) 20:16:55)
No75201 (mura さん) に返信

> データグリッドというのもあるようですが、タイトルが1行分しかなく、またデータソースや
> バインドといった仕組みもなんだかよく飲み込めなかったので、自分の分かりやすい方法でやってみました。

VS2008 ということですと ASP.NET 3.5 が使えると思います。そうであれ
ば ListView を使うことをお勧めします。

table, tr, th, td タグを使って組める表なら 2 行でも 3 行でもどのよ
うにも作れます。

以下のページのような感じです。

http://surferonwww.info/BlogEngine/post/2010/08/26/Paging-with-ObjectDataSource.aspx

ListView では質問者さんの目的に合わないという場合は、どういう点が問
題か書いていただければ、別の対応策を考えてみます。
引用返信 編集キー/
■75220 / inTopicNo.8)  Re[4]: tableRowへのCellの追加について
□投稿者/ mura (9回)-(2015/03/06(Fri) 19:26:30)
たびたびありがとうございます。

今回は、「時間数」表示枠として2セル持っており、例えばデータベース上で「130」(1時間30分)
というデータを読み込んだ場合に、他のマスタで管理している「表示方法区分」により、

2つのセルにそれぞれ
  1 | 30  (1時間30分)
1.5 | H   (1.5時間)
 90 | M   (90分)
などというように表示内容が変わったりします。

また、レコード上に「摘要コード」「摘要入力欄」があり、
摘要コードに数値が入っている場合は、摘要マスタを検索してマスタから摘要内容を表示するが、
摘要コードに特定の数値(オール9など)が入っている場合は、摘要入力欄の内容を表示する
などといった、面倒な処理があります。

そのため、DBを読み込んでプログラムコードで判定しながら表示内容を変えていこうと考えたものです。

恥ずかしながら自分はVB6人間のため、.netの機能があまりよく理解できておらず、
もっとスマートなやり方はいろいろとあるのでしょうが、ついていけていないというのが
正直なところです。


引用返信 編集キー/
■75221 / inTopicNo.9)  Re[5]: tableRowへのCellの追加について
□投稿者/ WebSurfer (512回)-(2015/03/06(Fri) 20:41:09)
No75220 (mura さん) に返信

以下の記事が参考になりませんか?

http://surferonwww.info/BlogEngine/post/2010/08/17/Data-bind-method.aspx

上の記事の Description メソッドとそれの Text プロパティへの設定の
例を見てください。

質問者さんの言われる「表示方法区分」というのがどういうものか、どの
ように取得できるのか分かりませんが、何らかの手段でサーバー側で取得
できるのですよね?

であれば、例えば(あくまで例えばですよ)、Eval("時間数") と「表示方
法区分」を引数として取り、その引数に応じて適当な文字列を返すメソッド
を作り、それを以下のように Text プロパティに設定すれば望むことができ
るのではないですか?

Text='<%# Description((string)Eval("時間数"), 「表示方法区分」) %>'

「摘要コード」「摘要入力欄」の方も同様に、それらを引数にして適当な
文字列を組み立てて返すメソッドを作ればよさそうですが?

引用返信 編集キー/
■75294 / inTopicNo.10)  Re[6]: tableRowへのCellの追加について
□投稿者/ mura (10回)-(2015/03/10(Tue) 17:19:56)
ありがとうございます。

結論としまして、もう少し基礎から勉強したほうがよいということとなりました。

甚だ情けない話では有りますが、データソースとかバインディングとか言われてしまうと
「よくわからん、SQLゴリゴリ書いたほうが早い」となってしまい、テーブルアダプターも
まともに使ったことがないのです。

提示いただいたページの内容が理解できる程度になるまで勉強しなおすことにします。

ということでとりあえず解決済みとします。
長々とありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -