Доступ к текстовому полю на C #, созданному на лету

#c# #asp.net #textbox #findcontrol

#c# #asp.net #текстовое поле #findcontrol

Вопрос:

Мой код генерирует текстовое поле на лету в C # ( page_load функция). Могу ли я получить к нему доступ в коде позже? Это выдает ошибку компиляции и, похоже, не работает. Кто-нибудь может подтвердить?

Код для дополнительной проблемы

 aContent  = "<table>";
aContent  = "<tr><td>lablel </td><td style='bla blah'><input type='textbox' id='col-1' name='col-1'/></td></tr> ... 10 such rows here
</table>"

spanMap.InnerHtml = aContent;
  

Содержимое отображается нормально, но повторная итерация не возвращает текстовое поле. Я называю это так

  TextBox txt = (TextBox)this.FindControlRecursive(spanMap, "col-1");
 // txt = (TextBox) spanMapping.FindControl("col-1"); this does not work too
 if (txt != null)
 {
      txt.Text = "A";
 }
  

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать код, который вы используете?

2. Где ваш код? Вы добавили его в элементы управления страницы? Вы добавляете его повторно при каждой обратной передаче?

3. Как кто-нибудь может проверить? опубликуйте код.

4. Я спрашиваю, возможно ли это. Я думаю, что вопрос хорошо объясняет это. Кстати, это не мой код, его написал кто-то другой.

5. Это старый вопрос, но во-первых, «текстовое поле» — это не текстовое поле, это ввод html. Вы должны добавить текстовое поле, например текстовое поле nTxt = новое текстовое поле(); nTxt.id = «col-1»; spanMap.Controls. Добавить (nTxt);

Ответ №1:

Предполагая, что вы сохраняете его правильно, вы должны иметь возможность получить к нему доступ в коде, используя FindControl метод. В зависимости от того, где находится элемент управления, возможно, придется выполнять рекурсивный поиск по иерархии элементов управления:

 private Control FindControlRecursive(Control root, string id)  
{  
    if (root.ID == id) 
    {  
        return root;  
    }  

    foreach (Control c in root.Controls)  
    {  
        Control t = FindControlRecursive(c, id);  
        if (t != null)  
        {  
            return t;  
        }  
    }  

    return null;  
} 
  

Используя FindControlRecursive :

 TextBox txt = this.FindControlRecursive(Page.Form, "TextBox1") as TextBox;
if (txt != null)
{
    string text = txt.Text;
}
  

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

Редактировать

Я думаю, вам нужно изменить способ добавления содержимого в контейнер. Вместо того, чтобы использовать <span> , я бы использовал Panel , а вместо создания разметки просто добавил элементы управления на панель в code-behind:

 TextBox txt = new TextBox();
txt.ID = String.Format("txt_{0}", Panel1.Controls.Count);
Panel1.Controls.Add(txt);    
  

Комментарии:

1. Так что, я думаю, FindControl — мой единственный способ получить к нему доступ. Я не могу получить к нему прямой доступ. @sylence ниже упоминал добавление ссылки, но это не очень понятно.

2. Да, вам определенно нужно FindControl получить доступ к динамическому элементу управления. Вы не можете получить к нему прямой доступ.

3. Я пробовал этот код, но он не сработал. Мой html на самом деле находится внутри диапазона. spanMap.InnerHtml = aContent; . Внутри есть таблица, а внутри таблицы — мое текстовое поле. Хотя вам нужно изменить as Textbox на TextBox( ...) во втором блоке кода.

4. Я в замешательстве… в чем проблема? У описанного выше метода не должно возникнуть проблем с перемещением по дереву.

5. Я включил дополнительный код в вопрос. Он просто не находит ни одного дочернего элемента, кроме одного literalcontrol. Также я использую masterpage, если это имеет какое-либо значение. Я использовал его раньше, хотя и это сработало (не в этом конкретном примере).

Ответ №2:

Вот пример:

 <%@ Page Language="C#" %>
<script type="text/C#" runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        var textBox = new TextBox();
        textBox.ID = "myTextBox";
        textBox.Text = "hello";
        Form1.Controls.Add(textBox);
    }

    protected void BtnTestClick(object sender, EventArgs e)
    {
        var textBox = (TextBox)Form1.FindControl("myTextBox");
        lblTest.Text = textBox.Text;
    }
</script>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form id="Form1" runat="server">
        <asp:LinkButton ID="btnTest" runat="server" Text="Click me" OnClick="BtnTestClick" />
        <asp:Label ID="lblTest" runat="server" />
    </form>
</body>
</html>