在Updatepanel中循环子控件



我编写了一个方法,该方法循环遍历对象的所有属性,并将它们映射到具有相同名称(或前缀+名称)的控件。问题是,我在更新面板中有某些控件(当选择不同的选项时会更改的下拉列表),在运行此方法时找不到这些控件。我读了这篇文章,并调整了下面的方法来适应它,但它仍然找不到更新面板中的控件。所有控件都有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;
} 

相关内容

  • 没有找到相关文章

最新更新