2009年12月20日 星期日

動態產生 datagrid Columns - TextBox

動態產生 datagrid Columns - TextBox

之前遇到的CASE是 checkbox:


http://roxsu.blogspot.com/2009/01/datagrid-columns.html


這次則是TextBox, 而且是在同TemplateColumn下產生


ItemTemplate及EditItemTemplate


首先建立一個介面(temptext.vb)如下:




Public Class temptext
Implements ITemplate

Private plbnID As String
Private ItemType As ListItemType
Private intW As Unit

Public Sub New(ByVal lbnID As String, ByVal item_type As ListItemType, ByVal inW As Integer)
plbnID = lbnID
ItemType = item_type
intW = New Unit(inW)
End Sub

Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements

System.Web.UI.ITemplate.InstantiateIn
Select Case ItemType
Case ListItemType.Item
Dim lbn As New Label
lbn.ID = "L" + plbnID
lbn.Text = ""
lbn.Visible = True
AddHandler lbn.DataBinding, AddressOf TemplateControl_DataBinding
container.Controls.Add(lbn)
Case ListItemType.EditItem
Dim lbn As New TextBox
lbn.ID = plbnID
lbn.Text = ""
lbn.Visible = True
lbn.Width = intW
AddHandler lbn.DataBinding, AddressOf TemplateControl_DataBinding
container.Controls.Add(lbn)
End Select
End Sub

Private Sub TemplateControl_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
Select Case ItemType
Case ListItemType.Item
Dim lc As Label
lc = CType(sender, Label)
Dim container As DataGridItem
container = CType(lc.NamingContainer, DataGridItem)
lc.Text = DataBinder.Eval(container.DataItem, plbnID)
Case ListItemType.EditItem
Dim lc As TextBox
lc = CType(sender, TextBox)
Dim container As DataGridItem
container = CType(lc.NamingContainer, DataGridItem)
lc.Text = DataBinder.Eval(container.DataItem, plbnID)
End Select
End Sub
End Class



和前例一樣


在datagrid Bind資料前定義column:


先將column資料讀入dataset: ds_bar


再分別新增datagrid : grdResults.Columns


及mytable.Columns





...
Dim myTable As DataTable = New DataTable
myTable.TableName = "reg"
myTable.Columns.Add(New DataColumn("tgl_sno", GetType(Integer)))
myTable.Columns.Add(New DataColumn("tgl_year", GetType(Integer)))
Dim v_bn As String
Dim i As Integer
Dim vi As Integer = 0
Dim v_col As TemplateColumn
For i = 0 To ds_bar.Tables(0).Rows.Count - 1
v_bn = ds_bar.Tables(0).Rows(i).Item

("cuki_kind").ToString.Trim
vi += 1
v_col = New TemplateColumn
If v_bn = "" Then
v_col.HeaderText = "None"
set_lab(vi, "None") ' 註0
Else
v_col.HeaderText = v_bn
set_lab(vi, v_bn)
End If
v_col.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
v_col.ItemTemplate = New temptext("tgl_psn" + Right((100 +

vi).ToString.Trim, 2), ListItemType.Item, 80)
v_col.EditItemTemplate = New temptext("tgl_psn" + Right((100 +

vi).ToString.Trim, 2), ListItemType.EditItem, 80)
grdResults.Columns.Add(v_col)
myTable.Columns.Add(New DataColumn("tgl_psn" + Right((100 +

vi).ToString.Trim, 2), GetType(Integer)))
If vi > 10 Then ' 註1
Exit For
End If
Next
txt_regcnt.Text = vi '註2
......


Sub set_lab(ByVal vi As Integer, ByVal v_nn As String)
Dim v_lab As Label = CType(Page.FindControl("lab_" + vi.ToString), Label)
v_lab.Text = v_nn
End Sub



註0: 再增行之動態LABEL.
註1: 暫訂最多10欄

而資料的取得要用Request.Form:


...
Dim da As SqlDataAdapter
Dim r As DataRow
Dim ds As DataSet = New DataSet
...
' SQL 字串及 GetDataAdapter
...
da.Fill(ds)
r = ds.Tables(0).Rows(0)
Dim cmdB As SqlCommandBuilder = New SqlCommandBuilder(da)
If inttcr_month.ToString.Length <> 0 Then
r("tgl_year") = inttcr_month
Else
r("tgl_year") = ""
End If
Dim ii As Integer
Dim v_uid As String = grdResults.Items

(e.Item.ItemIndex).UniqueID + ":tgl_psn"
Dim v_fld As String
Dim v_val As Integer
For ii = 1 To CInt(txt_regcnt.Text) '註2
v_val = Request.Form(v_uid + Right((ii +

100).ToString, 2))
v_fld = "tgl_psn" + Right((ii + 100).ToString, 2)
r(v_fld) = v_val
Next
da.Update(ds)
grdResults.EditItemIndex = -1
...



註2: LOAD將欄位數記錄及使用UPDATE在迴圈
在再增程序也可以用到:


...
Dim ii As Integer
Dim v_fld As String
Dim v_val As Integer
For ii = 1 To CInt(txt_regcnt.Text)
Dim v_txt As TextBox = CType(Page.FindControl("txt_" + ii.ToString), TextBox)
v_val = swfun.chk_v(v_txt.Text)
v_fld = "tgl_psn" + Right((ii + 100).ToString, 2)
r(v_fld) = v_val
Next
ds.Tables(0).Rows.Add(r)
da.Update(ds)
...

沒有留言: