2010-12-14 3 views
1

В моем приложении у меня есть 50 текстовых полей, которые я хочу найти, все элементы управления текстовым полем, используя код, и я хочу выполнить изменение цвета в текстовом поле после выполнения определенных проверок. Как я могу это понять? я использовал следующий код, но он не работает должным образомНайти управление текстовыми полями

foreach (Control cntrl in Page.Controls) 
    { 
     if (cntrl is TextBox) 
     { 
      //Do the operation 
     } 
    } 

<% @ Page Language = "C#" MasterPageFile = "~/HomePageMaster.master" AutoEventWireup = "истинный" CodeFile = "Default.aspx.cs" Inherits = "Default" Title = "Пример страницы" %>

+2

Выглядит правильно, с предостережением, что это не приведет к рекурсивному поиску, поэтому, если у вас есть элемент управления контейнера на вашей странице, любые текстовые поля в нем не будут найдены. Что вы подразумеваете под «не работает нормально»? – Oded

+0

Я думаю, что Одед прав, вы, скорее всего, получили их в контейнерах управления –

+0

Может пройти через ссылку SO http://stackoverflow.com/questions/4321458/enumerate-all-controls-in-the-form/4333243# 4333243 – dhinesh

ответ

1
protected void setColor(Control Ctl) 
{ 
    foreach (Control cntrl in Ctl.Controls) 
    { 
     if (cntrl.GetType().Name == "TextBox") 
     { 
       //Do Code 
     } 
     setColor(Control cntrl); 
    } 
} 

Вы можете назвать это с SetColor (страница)

+0

@Madhur Это только поиск в пределах каждого найденного элемента управления, а не коллекции pages.controls – Matt

+0

@Matt: Он был отредактирован. Первоначально это не было рекурсивным. –

+0

, вы можете поместить этот вызов setColor (Control ctrl) в else {}, так как вы не можете иметь текстовое поле в текстовом поле. – Pabuc

0

Вы, вероятно, придется рекурсивно пройти через каждый контейнер. У этого article есть один способ сделать это.

3

Я недавно начал делать это «современный» способ LINQ. Прежде всего, необходимо метод расширения, чтобы захватить все элементы управления типа вы заинтересованы в:

//Recursively get all the formControls 
public static IEnumerable<Control> GetAllControls(this Control parent) 
{ 
    foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control descendant in control.GetAllControls()) 
      { 
       yield return descendant; 
      } 
    } 
}` 

Тогда вы можете вызвать его в WebForm/управления:

var formCtls = this.GetAllControls().OfType<Checkbox>(); 

foreach(Checkbox chbx in formCtls){ 

//do what you gotta do ;) }

С уважением,
5arx

+0

im Получение сообщения, метод расширения должен быть определен в нестационарном родовом классе. – Fawad

1

Это один рекурсивно, поэтому он будет работать на всех элементах управления на странице. Обратите внимание: если вы хотите, чтобы он также просматривал текстовые поля в элементах управления данными, вы, вероятно, должны называть его в OnPreRender.

protected void Page_Load(object sender, EventArgs e) 
{ 
    ColorChange(this); 
} 

protected static void ColorChange(Control parent) 
{ 
    foreach (Control child in parent.Controls) 
    { 
     if (child is TextBox) 
      (child as TextBox).ForeColor = Color.Red; 

     ColorChange(child); 
    } 
}