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