ASP.Net Доступ к дочерним элементам управления в элементе управления FormView
Я использую элемент управления FormView (myFormView) с EditItemTemplate, который содержит несколько дочерних элементов управления. Когда я использую стандартный элемент управления ASP.Net DropDownList (myDropList), я могу получить ссылку на myDropList, используя следующую строку:
((DropDownList)myFormView.FindControl("myDropList"))
Я могу получить полный доступ к свойствам myDropList и получить значение, выбранное в данный момент. Это замечательно.
Однако теперь мне нужно использовать сторонний дочерний элемент управления (FreeTextBox, который можно найти здесь http://www.freetextbox.com/) в элементе управления FormView. Я вызвал элемент управления FreeTextBox myFTB, и я использую выражение, подобное приведенному выше:
((FreeTextBox)myFormView.FindControl("myFTB"))
Тем не менее, это возвращает нуль, и, следовательно, я могу получить значения свойств для этого.
Кто-нибудь знает, почему возвращается null? Есть ли другой способ получить ссылку на элемент управления?
ТИА
2 ответа
Вам нужно будет использовать рекурсию, чтобы найти элемент управления в иерархии элементов управления.
Попробуйте использовать следующий метод:
FreeTextBox textBox = (FreeTextBox)FindControl(myFormView, "myFTB");
...
private Control FindControl(Control parent, string id)
{
foreach (Control child in parent.Controls)
{
string childId = string.Empty;
if (child.ID != null)
{
childId = child.ID;
}
if (childId.ToLower() == id.ToLower())
{
return child;
}
else
{
if (child.HasControls())
{
Control response = FindControl(child, id);
if (response != null)
return response;
}
}
}
return null;
}
Вы можете сделать это, чтобы найти элементы управления в виде формы....
ПРИМЕЧАНИЕ: приведенный ниже код находит все текстовые поля внутри элемента управления представлением формы.
protected void FormView1_DataBound(object sender, EventArgs e)
{
if (FormView1.CurrentMode == FormViewMode.Edit)
{
FindAllTextBoxes(FormView1);
}
}
private void FindAllTextBoxes(Control parent)
{
foreach (Control c in parent.Controls)
{
if (c.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox tbox = c as TextBox;
if (tbox != null)
{
// textbox found ....you could send this textbox, by reference to another procedure that assigns the values comparing
//it by tbox.ID
}
}
if (c.Controls.Count > 0)
{
FindAllTextBoxes(c);
}
}
}
Я надеюсь, что это поможет вам..