从c#中的LoadControl(字符串路径)获取和设置参数

时间:2012-10-22 20:26:04

标签: c# asp.net reflection user-controls loadcontrol

我想基于XML将usercontrols添加到我的页面:

<?xml version="1.0" encoding="utf-8" ?>
<Fields>
<Group name="Main" text="Innhold">
<Field type="TextBox" name="Name" text="Navn"></Field>
</Group>
</Fields>

usercontrol看起来像TextBox.ascx:

<div class="fieldWrapper">
<asp:Label runat="server"><%=Label %></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" />
</div>

我根据xml中的type属性执行LoadControl。像:LoadControl(type +“。ascx”):

var fields = from x in element.Elements("Field") select new
{
type = x.Attribute("type").Value,
name = x.Attribute("name").Value,
text = x.Attribute("text").Value,
                                    };
foreach (var field in fields)
{
var control = LoadControl("~/UserControls/FieldControls/" + field.type + ".ascx");
pnl.Controls.Add(control);
}
FieldsHolder.Controls.Add(pnl);

我想将text中的text属性传递给TextBox.ascx中的Label。 像这样:ctrl.Label = field.text 我知道如果我将控件转换为正确的类型,我可以这样做,但我不知道类型。 我可以用某种方式使用反射吗?

1 个答案:

答案 0 :(得分:1)

我假设您的所有UserControl共享相同的属性,如'Label'。我会创建一个如下所示的界面

public interface IUserControl
{
    string Label { get; set; }
}

以下是UserControl的实现

<强> CODE

public partial class TextBox : System.Web.UI.UserControl, IUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private string _label;
    public string Label
    {
        get { return _label; }
        set { _label = value; }
    }
}

您现在可以加载控件并设置如下所示的属性

foreach (var field in fields)
{
   var control = LoadControl("~/UserControls/FieldControls/" + field.type + ".ascx");
   (control as IUserControl).Label = field.text;
   pnl.Controls.Add(control);
}

我希望它可以帮助你实现你想要的......