- PR -

GridViewにおけるセル結合操作に関して

1
投稿者投稿内容
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 2008-07-04 16:58
いつもお世話になっております。
ただいま、VS2005(VB.NET)でWEBアプリケーションを開発しております。
GridViewのセル操作に関して不明な点があるので、質問させていただきます。

GridViewのデータ行において、1レコードが
1列目:RowSpan=2
2列目:上下2段
の形で表示されるようにしたいと思い、RowCreatedイベントで以下のコーディングを行いました。

========================================================================================================
Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

Dim myCell As TableCell = Nothing
Dim myRow As GridViewRow = Nothing
Dim idx As Integer = e.Row.RowIndex

If e.Row.RowType <> DataControlRowType.Header Then
e.Row.Cells(0).RowSpan = 2
myCell = New TableCell
myCell.Text = "idx=" & idx.ToString '2列目下段にはRowIndexを表示
myRow = New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)
myRow.Cells.Add(myCell)
Me.GridView1.Controls(0).Controls.Add(myRow)
End If

End Sub
========================================================================================================


あらかじめ3件のレコードをDataTableで用意し、1列目にはレコードの値、
2列目(上)には文字列"abc" を表示したところ、次のような表示になりました。

【1列目】,【2列目 上/下】
-----------------------------------
idx=0, (ブランクセル)
[1レコード目の値],abc/idx=1
[2レコード目の値],abc/idx=2
[3レコード目の値],abc/idx=-1


私の予想では、

【1列目】,【2列目 上/下】
-----------------------------------
[1レコード目の値],abc/idx=0
[2レコード目の値],abc/idx=1
[3レコード目の値],abc/idx=2

となるはずだったのですが、
・RowIndex=0のときに、1行目に挿入されてしまっている。
・(ShowFooter=Falseにしているのに)最終行がFooter扱い(RowTypeで判断しました)になってしまっている。

と2点の予想外の現象が発生しました。上記コードにおいて、セルの操作に関する誤りがあればどうぞご指摘
ください。宜しくお願いします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-07-05 06:12
質問の回答ではありませんが、このような複雑な表を作成するときは、

・ListView
・Repeater

などを使用して自分で<table></table>要素を制御した方が
簡単なのでは。

私は、シンプルな表以外はすべてListViewを使用しています。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 2008-07-06 14:33
Access様
ご回答いただき、ありがとうございます。

ListViewやRepeaterは未経験なので食わず嫌いしていたのですが、
これはいけませんね。Table制御が簡単ならこちらを利用することも視野に入れたい
と思います。

一応、GridViewに関して悪あがきしてみたのですが、
RowCreatedイベントの中ではなく、DataBind実行後に各行に対してRowSpan設定と新規
行挿入をしてやれば実現したいことが出来るのかな、というところまではわかりました。
(まだ実現はしておりませんが)
あるいは、データソースとなるDataTable内で、同じレコードを重複して取ってきて
あとはRowSpanだけ設定してやって・・・。うーん、いまいち。

なんとなく、新規行追加の
Me.GridView1.Controls(0).Controls.Add(myRow)  または
Me.GridView1.Controls(0).Controls.AddAt(idx,myRow)
の使い方がポイントかなと思います。

同じインデックスにAddAtしようとしても、RowCreatedイベントだとインデックスエラー
になって、DataBind後だと予想通りの動きをして。
RowCreated中ではまだGridViewRowコレクションが出来てないからかな・・・。
それにしてもGridViewRowコレクション追加という処理が、なんでこんな書き方に
なっているのか、違和感があります。
1

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