1

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

2 回答 2

2

尝试将这两种方法添加到新的或现有的类中:

    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 子句以检索所有控件(不是特定类型的控件)。

我希望这能帮到您!

于 2013-07-17T18:17:38.267 回答
0

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;
} 
于 2018-01-31T16:45:35.030 回答