- PR -

データグリッドテンプレート列の動的作成について

1
投稿者投稿内容
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2006-06-09 15:56
vb.netでWebアプリケーションを開発しています。

プログラムから動的にデータグリッドの列を作成する際に、データ型を判断して、BoundColumnとTemplateColumnを作成する関数をつくったのですが、TemplateColumnの方だけ、値が入らないようで困っています。

Public Sub DataGridColumnAdd(ByVal dg As DataGrid, ByVal type As System.Type,_
ByVal strDataField As String, ByVal strHeaderText As String)

Try
Select Case True
Case type Is GetType(Decimal)
'DataGridの列を設定
Dim tc As New TemplateColumn
tc.HeaderTemplate = New Template.DataGridTemplateNum(ListItemType.Header, strHeaderText)
tc.ItemTemplate = New Template.DataGridTemplateNum(ListItemType.Item, strDataField)
dg.Columns.Add(tc)
Exit Try

End Select

'DataGridの列を設定
Dim bc As New BoundColumn
bc.DataField = strDataField
bc.HeaderText = strHeaderText
dg.Columns.Add(bc)

Catch ex As Exception

Throw (ex)

End Try

End Sub

Public Class Template

Public Class DataGridTemplateNum
Implements ITemplate

Dim templateType As ListItemType
Dim columnName As String

Public Sub New(ByVal type As ListItemType, ByVal ColName As String)
templateType = type
columnName = ColName
End Sub

Sub InstantiateIn(ByVal container As Control) _
Implements ITemplate.InstantiateIn

Dim lc As New Literal

Select Case templateType
Case ListItemType.Header
lc.Text = columnName
container.Controls.Add(lc)
Case ListItemType.Item
AddHandler lc.DataBinding, AddressOf TemplateControl_DataBinding
Case ListItemType.EditItem
Case ListItemType.Footer
End Select

End Sub
Private Sub TemplateControl_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)

Dim lc As Literal
lc = CType(sender, Literal)
Dim container As DataGridItem
container = CType(lc.NamingContainer, DataGridItem)
lc.Text = DataBinder.Eval(container.DataItem, columnName)
End Sub

End Class

End Class

AddHandlerは実行されていますが、TemplateControl_DataBindingでcolumnNameに直接リソースの列名を指定しても、lc.Textに文字列「aaa」を入れても空値になってしまいます。
どなたか分かる方、アドバイスよろしくお願いします。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-06-09 16:56
私も少し前に、同じような質問をしました(^_^;)

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31015&forum=7&1

#コードは、BBコードで囲むと見やすくなりますよ。
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2006-06-09 18:23
URLありがとうございます。
よく見てみたところ、AddHandlerの後にcontainer.Controls.Addが抜けていました。
お騒がせしてすみません〜。

Case ListItemType.Item
AddHandler lc.DataBinding, AddressOf TemplateControl_DataBinding
container.Controls.Add(lc)
1

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