Не удается получить свойство «Текст» с помощью asp-control - PullRequest
1 голос
/ 06 июля 2011

Как получить свойства (например, Text) с элементами управления asp.net, которые были созданы программно при загрузке страницы, когда параметр IsPostBack имеет значение true?

Схема:

  • создание элемента управления (например, TextBox box = new TextBox(); box.ID = "BoxID")
  • управление отображением на странице (например, SomeControlInPageID.Controls.Add(box))
  • пользователь видит это текстовое поле (с идентификатором "BoxID", но у нас нет возможности заставить текстовое свойство использовать BoxID.Text, потому что его элемент управления был создан программно!) На странице и добавляет в него некоторый текст
  • пользователь нажимает кнопку (asp: Button) на странице и запускает процесс перезагрузки страницы
  • start метод Page_Load & параметр IsPostBack принимает истинное значение
  • я пытаюсь использовать этот код для получения Text свойства в методе Page_Load, но это не работает ...:

    void Page_Load()
    {
       if (Page.IsPostBack)
       {
        TextBox box = SomeControlInPageID.FindControl("BoxID") as TextBox;
        string result = box.Text;
       }
       else
       {
        // creating controls programatically and display them in page
        ...
       }
    }
    

box.Text в этом коде всегда принимает нулевое значение.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Ключевым моментом здесь является необходимость повторного создания динамических элементов управления при каждой загрузке страницы. Как только элементы управления будут созданы, ASP.NET сможет заполнить отправленные значения обратно в эти элементы управления. Я включил полный рабочий пример ниже. Обратите внимание, что я добавляю элемент управления в событие OnInit (которое срабатывает до Page_Load), а затем я могу прочитать значение обратно в событии Page_Load, если произошла обратная передача.

<%@ Page Language="C#" AutoEventWireup="true" %>
<html>
<body>
    <form id="form1" runat="server">
    <asp:Panel ID="myPanel" runat="server" />
    <asp:Button ID="btnSubmit" Text="Submit" runat="server" />
    <br />
    Text is: <asp:Literal ID="litText" runat="server" />
    </form>
</body>
</html>
<script runat="server">
protected void Page_Load(object sender, System.EventArgs e)
{
    if(Page.IsPostBack)
    {
        var myTextbox = myPanel.FindControl("myTextbox") as TextBox;
        litText.Text = myTextbox == null ? "(null)" : myTextbox.Text;
    }
}

protected override void OnInit(EventArgs e)
{
    AddDynamicControl();
    base.OnInit(e);
}

private void AddDynamicControl()
{
    var myTextbox = new TextBox();
    myTextbox.ID = "myTextbox";
    myPanel.Controls.Add(myTextbox);
}
</script>
1 голос
/ 06 июля 2011

Пожалуйста, посмотрите на pageLifeCycle aspx-страницы.Вам нужно будет добавить текстовое поле в обработчик Page_Init.После этого вы можете получить доступ к своему textBox в событии page_load.

protected void Page_Init(object sender, EventArgs e)
{
    TextBox tb = new TextBox();
    tb.ID = "textbox1";
    tb.AutoPostBack = true;
    form1.Controls.Add(tb);
}
protected void Page_Load(object sender, EventArgs e)
{
    /// in case there are no other elements on your page
    TextBox tb = (TextBox)form1.Controls[1];
    /// or you iterate through all Controls and search for a textbox with the ID 'textbox1'
    if (Page.IsPostBack)
    {
        Debug.WriteLine(tb.Text);   /// only for test purpose (System.Diagnostics needed)
    }        
}

hth

...