#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>