У меня есть метод, который находит все средства управления, выполняет итерации через них, определяет, являются ли они текстовым полем, выпадающим списком, и т.д. получает их идентификационное название, и в зависимости от идентификационного названия оно установит булев оператор (таким образом, я знал бы, завершен ли тот раздел формы, и пошлет по электронной почте определенной группе людей), 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;
}
}
}
}
}
}
Вместо использования лямбда-выражения я создал метод, который обрабатывает элемент управления для меня, и в зависимости от имени элемента управления, он устанавливает этот раздел в 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);
}
}
}
Почему бы просто не использовать метод 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
Трудно понять логику вашего кода, но я уверен, что его можно написать проще. Например, вы можете сделать что-то вроде этого:
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. Таким образом, вы можете повторно использовать его для разных типов. Это решение, максимально приближенное к вашему коду, но я думаю, было бы лучше использовать рекурсивный метод, просматривающий страницу и передавая этому методу ваши предикаты в виде лямбда-выражений.
Немного исправлен код, чтобы включать каждую проверку только один раз.
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;
}
}
}
}