动态gridview列事件问题

时间:2009-03-31 12:44:05

标签: asp.net gridview dynamic

我有一个GridView(可选),我想在所选行的新行中生成一个动态GridView。

  1. 我可以在Gridview1 PreRender事件中动态添加行和gridview。我需要使用此事件,因为:
      每次回发都不会调用
    • _OnDataBound(_OnRowDataBound也一样)
    • _OnInit是不可能的,因为Gridview的'Inner table'是在Init
    • 之后添加的
    • _OnLoad是不可能的,因为尚未选择“已选择”行。
  2. 我可以根据我的ITemplate类将列添加到动态GridView中。 但现在按钮事件不会触发......有什么建议吗?
  3. 动态添加gridview:

    Private Sub GridView1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.PreRender
        Dim g As GridView = sender
        g.DataBind()
    
        If g.SelectedRow IsNot Nothing AndAlso g.Controls.Count > 0 Then
            Dim t As Table = g.Controls(0)
            Dim r As New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)
            Dim c As New TableCell
    
            Dim visibleColumnCount As Integer = 0
    
            For Each d As DataControlField In g.Columns
                If d.Visible Then
                    visibleColumnCount += 1
                End If
            Next
    
            c.ColumnSpan = visibleColumnCount
            Dim ph As New PlaceHolder
    
            ph.Controls.Add(CreateStockGrid(g.SelectedDataKey.Value))
    
            c.Controls.Add(ph)
    
            r.Cells.Add(c)
            t.Rows.AddAt(g.SelectedRow.RowIndex + 2, r)
        End If
    End Sub
    
    Private Function CreateStockGrid(ByVal PnmAutoKey As String) As GridView
    
        Dim col As Interfaces.esColumnMetadata
        Dim coll As New BLL.ViewStmCollection
        Dim entity As New BLL.ViewStm
        Dim query As BLL.ViewStmQuery = coll.Query
    
        Me._gridStock.AutoGenerateColumns = False
    
        Dim buttonf As New TemplateField()
        buttonf.ItemTemplate = New QuantityTemplateField(ListItemType.Item, "", "Button")
        buttonf.HeaderTemplate = New QuantityTemplateField(ListItemType.Header, "", "Button")
        buttonf.EditItemTemplate = New QuantityTemplateField(ListItemType.EditItem, "", "Button")
    
        Me._gridStock.Columns.Add(buttonf)
    
        For Each col In coll.es.Meta.Columns
            Dim headerf As New QuantityTemplateField(ListItemType.Header, col.PropertyName, col.Type.Name)
            Dim itemf As New QuantityTemplateField(ListItemType.Item, col.PropertyName, col.Type.Name)
            Dim editf As New QuantityTemplateField(ListItemType.EditItem, col.PropertyName, col.Type.Name)
    
            Dim f As New TemplateField()
    
            f.HeaderTemplate = headerf
            f.ItemTemplate = itemf
            f.EditItemTemplate = editf
    
            Me._gridStock.Columns.Add(f)
        Next
    
        query.Where(query.PnmAutoKey.Equal(PnmAutoKey))
    
        coll.LoadAll()
    
        Me._gridStock.ID = "gvChild"
        Me._gridStock.DataSource = coll
        AddHandler Me._gridStock.RowCommand, AddressOf Me.gv_RowCommand
    
        Me._gridStock.DataBind()
    
        Return Me._gridStock
    End Function  
    

    ITemplate课程:

    Public Class QuantityTemplateField : Implements ITemplate
    Private _itemType As ListItemType
    Private _fieldName As String
    Private _infoType As String
    
    Public Sub New(ByVal ItemType As ListItemType, ByVal FieldName As String, ByVal InfoType As String)
        Me._itemType = ItemType
        Me._fieldName = FieldName
        Me._infoType = InfoType
    End Sub
    
    Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
        Select Case Me._itemType
            Case ListItemType.Header
                Dim l As New Literal
                l.Text = "&lt;b&gt;" & Me._fieldName & "</b>"
                container.Controls.Add(l)
            Case ListItemType.Item
                Select Case Me._infoType
                    Case "Button"
                        Dim ib As New Button()
                        Dim eb As New Button()
                        ib.ID = "InsertButton"
                        eb.ID = "EditButton"
                        ib.Text = "Insert"
                        eb.Text = "Edit"
                        ib.CommandName = "Edit"
                        eb.CommandName = "Edit"
                        AddHandler ib.Click, AddressOf Me.InsertButton_OnClick
                        AddHandler eb.Click, AddressOf Me.EditButton_OnClick
                        container.Controls.Add(ib)
                        container.Controls.Add(eb)
                    Case Else
                        Dim l As New Label
                        l.ID = Me._fieldName
                        l.Text = ""
                        AddHandler l.DataBinding, AddressOf Me.OnDataBinding
                        container.Controls.Add(l)
                End Select
            Case ListItemType.EditItem
                Select Case Me._infoType
                    Case "Button"
                        Dim b As New Button
                        b.ID = "UpdateButton"
                        b.Text = "Update"
                        b.CommandName = "Update"
                        b.OnClientClick = "return confirm('Sure?')"
                        container.Controls.Add(b)
                    Case Else
                        Dim t As New TextBox
                        t.ID = Me._fieldName
                        AddHandler t.DataBinding, AddressOf Me.OnDataBinding
    
                        container.Controls.Add(t)
                End Select
        End Select
    End Sub
    
    Private Sub InsertButton_OnClick(ByVal sender As Object, ByVal e As EventArgs)
        Console.WriteLine("insert click")
    End Sub
    
    Private Sub EditButton_OnClick(ByVal sender As Object, ByVal e As EventArgs)
        Console.WriteLine("edit click")
    End Sub
    
    Private Sub OnDataBinding(ByVal sender As Object, ByVal e As EventArgs)
        Dim boundValue As Object = Nothing
        Dim ctrl As Control = sender
        Dim dataItemContainer As IDataItemContainer = ctrl.NamingContainer
        boundValue = DataBinder.Eval(dataItemContainer.DataItem, Me._fieldName)
    
        Select Case Me._itemType
            Case ListItemType.Item
                Dim fieldLiteral As Label = sender
                fieldLiteral.Text = boundValue.ToString()
            Case ListItemType.EditItem
                Dim fieldTextbox As TextBox = sender
                fieldTextbox.Text = boundValue.ToString()
        End Select
    End Sub
    End Class
    

1 个答案:

答案 0 :(得分:2)

哦,我的哦,我去了MVC,任何读这个问题的人都应该这样做:)