Лучший путь? Нахождение средств управления ASP.NET, находя их идентификатор

У меня есть метод, который находит все средства управления, выполняет итерации через них, определяет, являются ли они текстовым полем, выпадающим списком, и т.д. получает их идентификационное название, и в зависимости от идентификационного названия оно установит булев оператор (таким образом, я знал бы, завершен ли тот раздел формы, и пошлет по электронной почте определенной группе людей), unfortunetly, это сделано со слишком многими, если операторы и задавались вопросом, мог ли я получить некоторую справку, делающую это более управляемое

protected void getEmailGroup()
{
    Control[] allControls = FlattenHierachy(Page);
    foreach (Control control in allControls)
    {
        if (control.ID != null)
        {
            if (control is TextBox)
            {
                TextBox txt = control as TextBox;
                if (txt.Text != "")
                {
                    if (control.ID.StartsWith("GenInfo_"))
                    {
                        GenInfo = true;
                    }
                    if (control.ID.StartsWith("EmpInfo_"))
                    {
                        EmpInfo = true;
                    }
                }
            }
            if (control is DropDownList)
            {
                DropDownList lb = control as DropDownList;
                if (lb.SelectedIndex != -1)
                {
                    if (control.ID.StartsWith("GenInfo_"))
                    {
                        GenInfo = true;
                    }
                    if (control.ID.StartsWith("EmpInfo_"))
                    {
                        EmpInfo = true;
                    }
                }
            }
        }
    }
}      
7
задан John Saunders 1 June 2010 в 18:50
поделиться

4 ответа

Вместо использования лямбда-выражения я создал метод, который обрабатывает элемент управления для меня, и в зависимости от имени элемента управления, он устанавливает этот раздел в true

public bool setGroup(Control ctrl)
    {
        isAControl = false;

        //set a section to true, so it will pull the html
        if (ctrl.ID.StartsWith("GenInfo_"))
        {
            GenInfo = true;
            lstControls.Add(ctrl.ID.Replace("GenInfo_", ""));
            isAControl = true;
            return isAControl;
        }

вот небольшой фрагмент моего кода Я хочу проверить только определенные элементы управления (чтобы ускорить процесс), и я прохожу через каждый элемент управления, так как каждый элемент имеет свой способ получения значения (textbox будет использовать .text, а dropdownlist будет использовать .selectedValue)

if(control is TextBox || control is DropDownList || control is RadioButton || control is RadioButtonList 
                || control is CheckBox || control is CheckBoxList)
                {
                    if (control is TextBox)
                    {
                        TextBox txt = control as TextBox;
                        if (txt.Text != "" && txt.Text != "YYYY/MM/DD")
                        {
                            setGroup(control);
                            if (isAControl)
                            {
                                string controlNoGroup = lstControls.Last();
                                strHtml = strHtml.Replace("@" + (controlNoGroup.ToString()) + "@", txt.Text);
                            }
                        }
                    }
0
ответ дан 7 December 2019 в 12:15
поделиться

Почему бы просто не использовать метод Control.FindControl(string)?

private void Button1_Click(object sender, EventArgs MyEventArgs)
{
 // Найдите элемент управления на странице.
 Control myControl1 = FindControl("TextBox2");
 if(myControl1!=null)
 {
 // Получите родителя элемента управления.
 Control myControl2 = myControl1.Parent;
 Response.Write("Parent of the text box is : " + myControl2.ID);
 }
 else
 {
 Response.Write("Элемент управления не найден");
 }
}

from: https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.findcontrol

4
ответ дан 7 December 2019 в 12:15
поделиться

Трудно понять логику вашего кода, но я уверен, что его можно написать проще. Например, вы можете сделать что-то вроде этого:

DropDownBox box = FlattenHierachy(Page)
   .Where(c => c is DropDownList)
   .Cast<DropDownList>()
   .Where(d => d.SelectedIndex != -1)
   .FirstOrDefault();
if (box != null)
{
   if (box.ID.StartsWith("GenInfo_"))
   {
      GenInfo = true;
   }
   if (box.ID.StartsWith("EmpInfo_"))
   {
       EmpInfo = true;
   }
}

Очевидно, вы можете сделать это обобщенным, если извлечете лямбда-выражение из второго вызова Where. Таким образом, вы можете повторно использовать его для разных типов. Это решение, максимально приближенное к вашему коду, но я думаю, было бы лучше использовать рекурсивный метод, просматривающий страницу и передавая этому методу ваши предикаты в виде лямбда-выражений.

1
ответ дан 7 December 2019 в 12:15
поделиться

Немного исправлен код, чтобы включать каждую проверку только один раз.

protected void getEmailGroup()
    {
        Control[] allControls = FlattenHierachy(Page);
        foreach (Control control in allControls)
        {
            if (control.ID != null &&
                ((control is TextBox && ((TextBox)control).Text = "" )
                  || (control is DropDownList && ((DropDownList)control).SelectedIndex != -1 ))
             {
                 if (control.ID.StartsWith("GenInfo_"))
                    GenInfo = true;
                 if (control.ID.StartsWith("EmpInfo_"))
                     EmpInfo = true;

             }
           }
        }
    }
0
ответ дан 7 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: