Визуализировать элементы управления .net в строку и получить события для запуска - PullRequest
2 голосов
/ 29 июля 2011

У меня есть проблема, когда я пытаюсь сгенерировать HTML-код для отображения на странице, поступающей из базы данных, в форме шаблона с различными фигурными скобками, которые заменяются динамическим содержимым во время выполнения. Например, фигурная скобка {Content} заменяется несколькими флажками, радиобуттонами, текстовыми полями и кнопкой отправки. Я делаю это, динамически создавая элементы управления и отображая их как строку, а затем выводя эту строку в браузер. Но он не распознает события, назначенные элементам управления, когда они генерируются. Возможно, я неправильно подхожу к этой проблеме, но я не понимаю, как еще это можно сделать. Ниже приведен пример кода, чтобы показать, чего я пытаюсь достичь. Посоветуйте, пожалуйста, как решить эту проблему.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        Dim PageContent As StringBuilder = New StringBuilder()
        PageContent.Append("A lot of content from database laid out using HTML templates stored in database including the below mentioned button code.")

        '# To illustrate how pagecontent is built using lots of such controls rendered to string
        Dim SubmitButton As Button = New Button()
        SubmitButton.ID = "MySubmitButton"
        SubmitButton.Text = "Submit"
        SubmitButton.CssClass = "SubmitButton"
        'Page.Controls.Add(SubmitButton)        '# This line I thought would resolve the issue, but it doesn't as the .net form is not built at the time of page load
        AddHandler SubmitButton.Click, AddressOf ClickHandler

        PageContent.Append(RenderControlToString(SubmitButton))

        Dim Output As Literal = New Literal()
        Output.Text = PageContent.ToString()
        Page.Controls.Add(Output)

    End If

End Sub

''' <summary>
''' Button Click Hander
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub ClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)

    '# Control never gets here!!!!!
    Response.Write("<br/>Button Clicked!")
    Response.End()

End Sub

''' <summary>
''' Render control to string
''' </summary>
''' <param name="control"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function RenderControlToString(control As Control) As String

    Dim sb = New StringBuilder()
    Using sw = New StringWriter(sb)
        Using textWriter = New HtmlTextWriter(sw)
            control.RenderControl(textWriter)
        End Using
    End Using

    Return sb.ToString()

End Function

Спасибо за совет!

Ответы [ 3 ]

6 голосов
/ 29 июля 2011

Динамическая загрузка элементов управления в .Net немного сбивает с толку.Я вижу четыре проблемы с тем, что ты делаешь.

  1. Вы пытаетесь динамически добавлять элементы управления только на начальном HTTP GET (не на обратных передачах).Вам нужно добавлять элементы управления каждый раз.Здесь вы не привязываете данные, вы добавляете элементы управления в дерево элементов управления Page.Эти элементы управления необходимо добавлять при каждом запуске страницы.

  2. Вы отображаете элементы управления в строку.Не делайте этого, просто добавьте их в дерево управления страницами, и они будут отображаться самостоятельно во время визуализации страницы.

  3. Используйте Page.LoadControl () при создании элементов управления.Это создаст элемент управления и заставит его события (жизненный цикл события страницы) догнать остальную часть страницы.

  4. Вы добавляете элементы управления немного позже в жизненном цикле событий страницы.Попробуйте добавить свои элементы управления в Page_Init.

Вот пример, который объединяет все это.Он динамически создает кнопку, а затем добавляет ее в элемент управления заполнителя.

protected void Page_Init(object sender, System.EventArgs e)
{
  var button = LoadControl(typeof(Button), null) as Button;
  button.Click += clickHandler;
  myPlaceholder.Controls.Add(button);
}
1 голос
/ 29 июля 2011

Используйте событие PreInit , как описано здесь, http://msdn.microsoft.com/en-us/library/ms178472.aspx,, здесь вы захотите добавить динамические элементы управления. На самом деле вам просто нужно выполнить Page.Controls.Add (), так как это происходит достаточно рано в жизненном цикле страницы, ASP должен обработать рендеринг за вас.

1 голос
/ 29 июля 2011

элементы управления должны быть инициированы в Page_Init, чтобы сохранить их в viewstate, и если контроль не существует в viewstate, aspx не поймет, чье событие было зарегистрировано.Инициализировать вашу кнопку на page_init

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