DOBON.NET DOBON.NETプログラミング掲示板過去ログ

GridViewに複数行にまたがる編集テキストボックスの作成

環境/言語:[.NetFramework2.0]
分類:[ASP.NET]

GridViewにて下記のような表示・編集を行おうと思っています。

(図解)
    列1    列2 列3 列4 列5
行1  タイトル  □  □  □  □
行2        □  □  □  □

 ・行2×列5のサイズのテーブルを作成します。
 ・列2〜列5はテキストボックスにて編集可能とします。
 ・列1は行1、2を結合しています。
 ・行追加ボタンを別途作成し、その場合は、上記と同サイズ(2×5)を
  1グループとして追加します。
 ・テキストボックスは条件によって、編集不可(ラベル表示)にします。


まだ知識不足なのですが、調べていると、templateでの作成は無理ではないのか。
また、その場合、セルへのコントロールの追加方法もわかりません。
なかなか上記の内容を満たせそうなサンプルもないので、質問させて頂きました。
お手数ですが、ご教授願えませんでしょうか。
よろしくお願いします。
補足ですが、下記内容にてテキストボックスでなく、ラベル表示は
できています。


Dim dt As New DataTable
Dim row As DataRow
'カラムの定義
For i As Integer = 0 To 4
dt.Columns.Add(New DataColumn())
Next
'1列目の作成
row = dt.NewRow
row(0) = "タイトル"
row(1) = "xx"
row(2) = "xx"
row(3) = "xx"
row(4) = "xx"
dt.Rows.Add(row)
'2列目の作成
row = dt.NewRow
row(0) = ""
row(1) = "xx"
row(2) = "xx"
row(3) = "xx"
row(4) = "xx"
dt.Rows.Add(row)

GridView.Datasource = dt
GridView.DataBind()


Protected Sub GridView_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GridView.RowCreated
'データ行でなければ何もしない
If e.Row.RowType = DataControlRowType.DataRow Then
'1行おきに、ヘッダ部を連結
If e.Row.RowIndex mod 2 = 1 Then
e.Row.Cells(0).RowSpan = 2
Else
e.Row.Cells.RemoveAt(0)
End If

'*********************************************
'ここから空のテキストボックスを追加してみる(name値も設定せずに・・・)
'*********************************************
For i As Integer = 0 To 4
e.Row.Cells(i).Controls.Add(New TextBox)
Next
End If
End Sub



この結果、現在はテキストボックスが表示されずに下記のようになってしまいます。

    列1    列2 列3 列4 列5
行1  タイトル  xx  xx  xx  xx
行2        xx  xx  xx  xx
はじめまして、H.K.R.と申します。
# 引っ込んだ略 → H.K.R. にハンドルネームを変更いたします。

 私はASP.NETについてはほとんど無知なので、
 もし変なことを書いていたら申し訳ないのですが、
 以下のコードでとりあえずGridView内のセルにTextBoxを表示することができましたので、
 試してみてはいかがでしょうか?

 ※ 私が試した環境:WindowsXPHomeSP2、InternetExplorer7、
           VisualWebDeveloper2008ExpressEdition(対象Frameworkは、.NET Framework 2.0)

Imports System.Data

Partial Class _Default
    Inherits System.Web.UI.Page

    ' GridView1がデザイナで配置されていることを前提とする
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        testC()
        MyBase.OnLoad(e)
    End Sub
    
    Private Sub testC()
        Dim dt As New DataTable
        For i As Integer = 1 To 5
            dt.Columns.Add(String.Format("列 - {0}", i))
        Next
        For i As Integer = 1 To 7
            Dim dr As DataRow = dt.NewRow
            For j As Integer = 1 To dt.Columns.Count
                dr.Item(j - 1) = String.Format("{0}行目のデータ{1}", i, j)
            Next
            dt.Rows.Add(dr)
        Next
        Me.GridView1.DataSource = dt
        Me.GridView1.DataBind()
        Me.GridView1.EnableViewState = False

        addTextBox()
    End Sub

    Private Sub addTextBox()
        For index As Integer = 0 To Me.GridView1.Rows.Count - 1
            Dim r As GridViewRow = Me.GridView1.Rows(index)
            'データ行でなければ何もしない
            If r.RowType = DataControlRowType.DataRow Then
                '*********************************************
                'ここから空のテキストボックスを追加してみる(name値も設定せずに・・・)
                '*********************************************
                For i As Integer = 1 To r.Cells.Count - 1
                    Dim tc As TableCell = r.Cells(i)
                    Dim tbx As New TextBox
                    tbx.Columns = 15
                    tbx.Text = tc.Text
                    tc.Controls.Add(tbx)
                Next

                '1行おきに、ヘッダ部を連結
                If r.RowIndex Mod 2 = 0 Then
                    r.Cells(0).RowSpan = 2
                Else
                    r.Cells.RemoveAt(0)
                End If
            End If
        Next
    End Sub

End Class

以上です。
2008/04/07(Mon) 14:54:44 編集(投稿者)
2008/04/07(Mon) 14:54:36 編集(投稿者)

ありがとうございます!
教えて頂いた内容で、テキストボックスを作成することができました。

処理上、教えて頂いたtestC関数内のDataTableへTextBoxへセットしたかったのですが、
処理の流れを見直して作成してみます。

この結果からすると、GridViewへ直接TextBoxは作成できるけど、DataTableへ
入れることができないということですよね?
また調べてみます。

ありがとうございます!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板