Доступ к текстовому полю в C #, которое создается на лету - PullRequest
0 голосов
/ 08 ноября 2011

Мой код генерирует TextBox на лету в 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";
 }

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Предполагая, что вы сохраняете его правильно, вы должны иметь возможность получить к нему доступ через код, используя метод 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 и вместо создания разметки просто добавил элементы управления на панель в выделенном коде:

TextBox txt = new TextBox();
txt.ID = String.Format("txt_{0}", Panel1.Controls.Count);
Panel1.Controls.Add(txt);    
1 голос
/ 08 ноября 2011

Вот пример:

<%@ 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>
...