2015-09-30 2 views
0

У меня есть usercontrol с событием gridview и rowcommand. Этот пользовательский контроль добавляется динамически с помощью LoadControl при нажатии кнопки на странице. Строка строк gridview не срабатывает.Gridview rowcommand событие не запускается динамически добавленным usercontrol

Вот код, который загружает UserControl по нажатию кнопки:

Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSearch.Click 

    '<ucTitle:SearchList ID="ucSearchList" runat="server" Visible="false" /> 
    Dim ucSearchList As TitleSearchList = LoadControl("~/Controls/TitleSearchList.ascx") 
    ucSearchList.ISBN = txtSearchISBN.Text 
    ucSearchList.LoadTitleSearchList() 
    pnlSearchResults.Controls.Add(ucSearchList) 

End Sub 

А вот код в UserControl

Открытый класс TitleSearchList Inherits System.Web.UI.UserControl

Public Property ISBN As String 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     LoadTitleSearchList() 
    End If 
End Sub 

Public Sub LoadTitleSearchList() 

    Dim _isbn As String = ISBN 

    Dim titles As New List(Of Title) 

    titles = New List(Of Title) From { 
             New Title With {.ISBN = _isbn, .TitleName = "Title check"}, 
             New Title With {.ISBN = _isbn, .TitleName = "Title check"}, 
             New Title With {.ISBN = _isbn, .TitleName = "Title check"}, 
             New Title With {.ISBN = _isbn, .TitleName = "Title check"} 
            } 
    gvTitle.DataSource = titles 
    gvTitle.DataBind() 

End Sub 

Public Sub gvTitle_Rowcommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles gvTitle.RowCommand 

    If e.CommandName = "TitleDetail" Then 

     Response.Redirect("TitleSearch.aspx?isbn=" & e.CommandArgument().ToString()) 

    End If 

End Sub 
End Class 

ответ

0

События в GridViews, которые динамически добавляются в UserControl, становятся немного уродливыми. Так как пользовательские контроллеры, которые добавляются динамически, должны быть добавлены повторно на обратной стороне, вам необходимо переподключить GridView DataSource, что заставляет вас автоматически потерять эти события для вас. Это, как говорится, вы все равно можете оттянуть с помощью синтаксического анализа __EVENTTARGET формы.

Добавить HiddenField, который сообщает вам, нужно ли повторно добавлять UserControl. Добавьте это в Page_Load обработчика событий:

If CBool(hdnTitleSearchActive.Value) = True Then 

     AddSearchListToPanel() 

    End If 

вызов AddSearchListToPanel() в вашем btnSearch_Click обработчика событий.

Теперь эту реализацию AddSearchListToPanel можно очистить, но это должно быть достаточно хорошо, чтобы вы могли двигаться. Обратите внимание, что кнопка, запускающая команду GridView в моем примере, имеет идентификатор lbtTest. Вы должны будете настроить на основе идентификатора, который вы используете.

Private Sub AddSearchListToPanel() 

    Dim ucSearchList As TitleSearchList = LoadControl("~/Controls/TitleSearchList.ascx") 
    ucSearchList.ISBN = txtSearchISBN.Text 
    ucSearchList.LoadTitleSearchList() 
    pnlSearchResults.Controls.Add(ucSearchList) 

    hdnTitleSearchActive.Value = True 

    Dim strEventTarget As String = HttpContext.Current.Request.Form("__EVENTTARGET") 

    If Not strEventTarget Is Nothing AndAlso strEventTarget.Contains("gvTitle$") AndAlso _ 
      strEventTarget.Contains("$lbtTest") Then 

     'Value example = gvTitle$ctl02$lbtTest 
     Dim intRowNumber As Integer = (CInt(strEventTarget.Substring(11, 2)) - 1) 

     Dim lbtCommandSource As LinkButton = CType(CType(ucSearchList.FindControl("gvTitle"), GridView).Rows(intRowNumber).FindControl("lbtTest"), LinkButton) 

     Dim objCommandEventArguments As New CommandEventArgs(lbtCommandSource.CommandName, lbtCommandSource.CommandArgument) 

     Dim objGridViewCommandEventArgs As New GridViewCommandEventArgs(lbtCommandSource, objCommandEventArguments) 

     ucSearchList.gvTitle_Rowcommand(lbtCommandSource, objGridViewCommandEventArgs) 

    End If 

End Sub 
+0

Спасибо за ответ. Не похоже, что стоит использовать пользовательский контроль в этом сценарии. –

Смежные вопросы