2009-03-31 8 views
0

나는 선택한 행 아래 새 행에 동적 GridView를 생성하려는 GridView (선택 가능)가 있습니다.동적 gridview 열 이벤트 문제

  1. Gridview1 PreRender 이벤트에서 행과 gridview를 동적으로 추가 할 수 있습니다.
    • _OnDataBound가 GRIDVIEW에 대한 '내부 테이블'초기화는
    • _OnLoad은 이후에 추가되기 때문에
    • _OnInit 수없는 (_OnRowDataBound에 대한 동일) 모든 포스트 백 호출되지 않습니다 때문에 나는이 이벤트를 사용할 필요가 'selected'행이 아직 선택되지 않았으므로 불가능합니다.
  2. 내 ITemplate 클래스를 기반으로 동적 GridView에 열을 추가 할 수 있습니다. 하지만 이제 버튼 이벤트가 발생하지 않습니다 .... 어떤 제안?

있는 gridview의 추가 동적 :

는 ITemplate 클래스
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 

:

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 

답변

2

내 오, 오, 내가 MVC에 갔다, 누군가가이 질문을 읽는 것은 동일한 작업을 수행해야합니다 :)