【问题标题】:Dynamic gridview columns event problem动态gridview列事件问题
【发布时间】:2009-03-31 12:44:05
【问题描述】:

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

  1. 我可以在 Gridview1 PreRender 事件中动态添加行和网格视图。我需要使用这个事件,因为:
    • _OnDataBound 不会在每次回发时调用(_OnRowDataBound 也是如此)
    • _OnInit 是不可能的,因为 Gridview 的“内表”是在 Init 之后添加的
    • _OnLoad 是不可能的,因为 'selected' 行还没有被选中。
  2. 我可以根据我的 ITemplate 类将列添加到动态 GridView。 但是现在按钮事件不会触发......有什么建议吗?

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

【问题讨论】:

    标签: asp.net gridview dynamic


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多