2010-09-23 3 views
1

Мне было интересно, можно ли в ASP.NET изменять свойства пучка элементов управления за одну операцию. Конечно, есть много способов обойти это, но знает ли кто-нибудь об этом элегантное решение?Изменение свойства нескольких элементов управления ASP.NET за одну операцию

Пример псевдокода

First Name 
<asp:TextBox runat="server" ID="tbxFirstName" ControlGroup="Editable" /> 
<asp:Label runat="server" ID="lblFirstName" ControlGroup="ReadOnly" /> 

Last Name 
<asp:TextBox runat="server" ID="tbxLastName" ControlGroup="Editable" /> 
<asp:Label runat="server" ID="lblLastName" ControlGroup="ReadOnly" /> 

protected void ChageMode(bool isReadOnly) 
{ 
    ControlGroups["Editable"].ForEach(c => c.Visible = !isReadOnly); 
    ControlGroups["ReadOnly"].ForEach(c => c.Visible = isReadOnly); 
} 

ответ

1

Я пытался выяснить, как это можно сделать, и я думаю, что нашел решение. Вы можете определить атрибуты на элементах управления в стороне aspx. Вы также можете запросить эти атрибуты, если элемент управления равен WebControl (многие элементы управления, такие как TextBox, Label, Button и т. Д. Являются WebControls, но некоторые элементы управления данными, такие как Repeater, GridView, не являются). Используя эту информацию, я написал рекурсивный метод. Вот он, с его использованием:

First Name 
<asp:TextBox runat="server" ID="tbxFirstName" ControlGroup="Editable" /> 
<asp:Label runat="server" ID="lblFirstName" ControlGroup="ReadOnly" /> 
Last Name 
<asp:TextBox runat="server" ID="tbxLastName" ControlGroup="Editable" /> 
<asp:Label runat="server" ID="lblLastName" ControlGroup="ReadOnly" /> 
<asp:Button ID="btn" runat="server" Text="Do" OnClick="btn_Click" /> 

код позади:

protected void btn_Click(object sender, EventArgs e) 
{ 
    var controlsOfGroupReadonly = ControlsInGroup("Readonly"); 
} 

protected IEnumerable<WebControl> FindControlsInGroup(Control control, string group) 
{ 
    WebControl webControl = control as WebControl; 
    if (webControl != null && webControl.Attributes["ControlGroup"] != null && webControl.Attributes["ControlGroup"] == group) 
    { 
     yield return webControl; 
    } 

    foreach (Control item in control.Controls) 
    { 
     webControl = item as WebControl; 
     if (webControl != null && webControl.Attributes["ControlGroup"] != null && webControl.Attributes["ControlGroup"] == group) 
     { 
      yield return webControl; 
     } 
     foreach (var c in FindControlsInGroup(item, group)) 
     { 
      yield return c; 
     } 
    } 
} 

protected IEnumerable<WebControl> ControlsInGroup(string group) 
{ 
    return FindControlsInGroup(Page, group); 
} 

Я не знаю, есть ли способ, чтобы преобразовать этот метод индексатор.

Я пробовал, и результат был удачным для меня.

Это был хороший вопрос. Спасибо :)

+0

Я думаю, что корневой элемент управления также должен быть перенесен в параметры, поскольку вы можете искать в FormView ex Также посещение полей шаблонов - проблема, которую стоит решить. –

+0

Вы на самом деле правы. Однако метод FindControlsInGroup делает то, что вы говорите. Вы можете передать любой элемент управления в качестве параметра, и он возвращает элементы управления в этой группе. Может быть, мы можем дать одно и то же имя методам ControlsInGroups и FindControlsInGroup в качестве перегрузок. –

1

вы можете сделать что-то подобное:


       pnl.Controls.OfType() 
        .ToList() 
        .ForEach(t => { t.ReadOnly = yourChoose; t.Text = yourValue; }); 

этот кусок поиска кода для каждого текстового поля в вашей страницы (а затем изменить только для чтения и свойства текста)

+0

Да, это прямое решение, но меня интересует, есть ли у ASP.NET что-то родное для этого или решение, требующее меньше кода (здесь вы не учитываете, что элементы управления могут быть вложенными) –

Смежные вопросы