在Updatepanel中循环子控件
本文关键字:控件 循环 Updatepanel | 更新日期: 2023-09-27 18:22:48
我编写了一个方法,该方法循环遍历对象的所有属性,并将它们映射到具有相同名称(或前缀+名称)的控件。问题是,我在更新面板中有某些控件(当选择不同的选项时会更改的下拉列表),在运行此方法时找不到这些控件。我读了这篇文章,并调整了下面的方法来适应它,但它仍然找不到更新面板中的控件。所有控件都有ID和runat="server"。
public static void MapObjectToPage(this object obj, Control parent, string prefix = "")
{
Type type = obj.GetType();
Dictionary<string, PropertyInfo> props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToDictionary(info => prefix + info.Name.ToLower());
ControlCollection theControls = parent is UpdatePanel ? ((UpdatePanel)parent).ContentTemplateContainer.Controls : parent.Controls;
foreach (Control c in theControls)
{
if (props.Keys.Contains(c.ClientID.ToLower()) && props[c.ClientID.ToLower()].GetValue(obj, null) != null)
{
string key = c.ClientID.ToLower();
if (c.GetType() == typeof(TextBox))
{
((TextBox)c).Text = props[key].PropertyType == typeof(DateTime?)
|| props[key].PropertyType == typeof(DateTime)
? ((DateTime)props[key].GetValue(obj, null)).ToShortDateString()
: props[key].GetValue(obj, null).ToString();
}
else if (c.GetType() == typeof(HtmlInputText))
{
((HtmlInputText)c).Value = props[key].PropertyType == typeof(DateTime?)
|| props[key].PropertyType == typeof(DateTime)
? ((DateTime)props[key].GetValue(obj, null)).ToShortDateString()
: props[key].GetValue(obj, null).ToString();
}
//snip!
}
if (c is UpdatePanel
? ((UpdatePanel)c).ContentTemplateContainer.HasControls()
: c.HasControls())
{
obj.MapObjectToPage(c);
}
}
}
尝试将这两个方法添加到新的或现有的类中:
public static List<Control> FlattenChildren(this Control control) { var children = control.Controls.Cast<Control>(); return children.SelectMany(c => FlattenChildren(c).Where(a => a is Label || a is Literal || a is Button || a is ImageButton || a is GridView || a is HyperLink || a is TabContainer || a is DropDownList || a is Panel)).Concat(children).ToList(); }
public static List<Control> GetAllControls(Control control)
{
var children = control.Controls.Cast<Control>();
return children.SelectMany(c => FlattenChildren(c)).Concat(children).ToList();
}
可以使用updatePanel作为参数(或主容器)调用GetAllControls方法。该方法返回"control"参数的所有子级。此外,您还可以删除Where子句来检索所有控件(而不是特定类型的控件)。
我希望这对你有帮助!
UpdatePanel可以直接访问。你不需要/不能使用FindControl来找到它。使用这个
foreach (Control ctrl in YourUpdatepanelID.ContentTemplateContainer.Controls)
{
if (ctrl.GetType() == typeof(TextBox))
((TextBox)(ctrl)).Text = string.Empty;
if (ctrl.GetType() == typeof(CheckBox))
((CheckBox)(ctrl)).Checked = false;
}