получить и установить параметры из LoadControl (строковый путь) в С #

Я хочу добавить на свою страницу элементы управления пользователем на основе XML:

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

Элемент управления пользователя выглядит так: TextBox.ascx:

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

Я делаю LoadControl на основе атрибута типа в xml. Например: LoadControl (тип + ".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);

Я хочу передать текстовый атрибут из xml в метку в TextBox.ascx. Примерно так: ctrl.Label = field.text Я знаю, если я привел элемент управления к правильному типу, я могу это сделать, но я не знаю тип. Могу ли я как-нибудь использовать для этого отражение?


person espvar    schedule 22.10.2012    source источник


Ответы (1)


Я предполагаю, что все ваши UserControls имеют те же свойства, что и «Label». Я бы создал интерфейс, как показано ниже

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

Вот реализация UserControl

КОД

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);
}

Надеюсь, это поможет вам достичь того, чего вы хотели ..

person Tariqulazam    schedule 22.10.2012
comment
Я пробовал это, но до сих пор не могу получить доступ к свойству Label. Создал интерфейс с labelproperty. реализовал интерфейс в TextBox.ascx. написал контрольную загрузку как IFieldControl. (управление как IFieldControl). Метка дает Невозможно разрешить символ 'Метка' - person espvar; 23.10.2012
comment
Он правильно компилируется? Обратите внимание: IFieldControl уже является частью платформы .NET 4.0. Убедитесь, что вы используете правильное пространство имен для IFieldControl. Я предлагаю переименовать интерфейс в IuserControl и попробовать еще раз. - person Tariqulazam; 23.10.2012
comment
Я просто подумал об этом. Я поменял имя и вуаля. Оно работает. Thang you! - person espvar; 23.10.2012