ASP.NET ошибка в связывании событий 2-го уровня + динамическое управление. Контрольный пример включен - PullRequest
1 голос
/ 22 марта 2011

Элемент управления Repeater в следующем тестовом примере содержит два runat = "server" DIVs . Каждый из них получает прикрепленный к ним TextBox через событие Repeater ItemCreated . Оба события имеют AutoPostBack = True и событие TextChanged, связанное с txt_TextChanged. Однако только TextBox первого уровня правильно указывает на событие в postBack страницы. TextBox второго уровня также вызывает возникновение postBack, но его значение не сохраняется в VIEWSTATE, а также событие не запускается .

Вот прямая ссылка на контрольный пример в файле .zip (загружено на мой личный сайт), а также весь необходимый код . Проект построен в VS2010 с использованием .NET Framework 4, но проблема также существует в 1.1, 2 и 3.5.

У кого-нибудь есть идеи о том, что не так и как заставить это работать?

ASPX

<asp:Repeater ID="rep" runat="server">
    <ItemTemplate>
        <!-- first level works -->
        <div id="divOutside" runat="server">
            <!-- second level doesn't work -->
            <div id="divInside" runat="server"></div>
        </div>
    </ItemTemplate>
</asp:Repeater>

Code-Behind

Public Class WebForm1
    Inherits System.Web.UI.Page

    Private Sub WebForm1_Init(sender As Object, e As System.EventArgs) Handles Me.Init
            If Not IsPostBack Then
                    Dim Table As New DataTable()
                    Table.Columns.Add("Column1")
                    Dim Row As DataRow = Table.NewRow()
                    Row("Column1") = ""
                    Table.Rows.Add(Row)

                    rep.DataSource = Table
                    rep.DataBind()
            End If
    End Sub

    Private Sub repTest_ItemCreated(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rep.ItemCreated
            ' outside
            Dim divOutside As HtmlGenericControl = DirectCast(e.Item.FindControl("divOutside"), HtmlGenericControl)
            Dim txtInput As New TextBox
            With txtInput
                    .ID = "txtInputOutside"
                    .AutoPostBack = True
                    .Text = "Event gets called, value persists accross postBack."
                    .Width = 400
            End With
            AddHandler txtInput.TextChanged, AddressOf txt_TextChanged
            divOutside.Controls.Add(txtInput)

            ' inside
            Dim divInside As HtmlGenericControl = DirectCast(e.Item.FindControl("divInside"), HtmlGenericControl)
            txtInput = New TextBox
            With txtInput
                    .ID = "txtInputInside"
                    .AutoPostBack = True
                    .Text = "Event NOT called, value is lost during postBack."
                    .Width = 400
            End With
            AddHandler txtInput.TextChanged, AddressOf txt_TextChanged
            divInside.Controls.Add(txtInput)
    End Sub

    Protected Sub txt_TextChanged(sender As Object, e As EventArgs)
    End Sub
End Class

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Вот ссылка на Microsoft Connect, где я сообщил, что это официальная ошибка: https://connect.microsoft.com/VisualStudio/feedback/details/652655/asp-net-bug-in-event-linking-of-2nd-level-dynamic-controls

Содержит 2 ЧАСТИЧНЫЕ обходные пути , которые работают в разделе загружаемых файлов, если кто-то заинтересован или сталкивается с той же проблемой, а также сведения о том, что я нашел на вкладке Обходные пути .

Короче говоря, это порядок получения ссылок на контейнеры и порядок добавления текстовых ящиков к соответствующим контейнерам, который либо вызывает проблему, либо работает как ожидалось.

Но, , чтобы не забыть самый важный момент , единственная причина, по которой TextBox первого уровня существует в первую очередь, заключается в демонстрации того, что я хочу в качестве функциональности. Если TextBox первого уровня вообще не добавляется, то оба обходных пути не дают какого-либо исправления. Пожалуйста, помните об этом при рассмотрении этой проблемы - поиск обходного пути, который вращается вокруг изменения порядка элементов, не является реальным решением или полностью работающим обходным решением!

Спасибо всем за вклад!

0 голосов
/ 22 марта 2011

Есть ли причина, по которой текстовые поля должны добавляться в div динамически? почему бы просто не поместить их в страницу aspx с повторителем, а затем включить / отключить привязку к элементу данных или сделать все, что вам нужно. Это должно работать нормально.

Кстати, если вы будете использовать панели вместо div, ваш подход на лету будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...