Не удается неявно преобразовать тип 'System.Web.UI.Control' в 'System.Web.UI.UserControl

Я пытаюсь загрузить usercontrol в C#.

Можете добавить.ascx на мою страницу.aspx, используя код ниже:

    Control MyUserControl;
    MyUserControl = LoadControl("~/controls/Editor.ascx");
    PlaceHolder1.Controls.Add(MyUserControl);

Однако я хочу передать ID в Editor.ascx, верхняя часть Editor.ascx содержит следующий код:

private int m_id = 0;
public int ID
{
    get { return m_id; }
    set { m_id = value; }
}
protected void Page_Load(object sender, EventArgs e)    
{
    if (!Page.IsPostBack && !Page.IsCallback)
    {
        using (DataClassesDataContext db = new DataClassesDataContext())
        {
            TB_Editor.Text = db.DT_Control_Editors.Single(x => x.PageControlID == ID).Text.Trim();
        }
    }

}

Я попытался привести управление к пользовательскому контролю, чтобы получить доступ к ID, см. Ниже

UserControl Edit = (UserControl)MyUserControl;

Но я получаю ошибку приведения.

есть идеи?

2 ответа

Я думаю, что ваша проблема в том, что вы используете кастинг, когда вы загружаете элемент управления. Вы должны привести к наиболее конкретному типу (в этом случае, Editor), передайте необходимые параметры и добавьте элемент управления к заполнителю.

Попробуй это:

Editor myUserControl = (Editor) LoadControl("~/controls/Editor.ascx");
myUserControl.ID = 42;
PlaceHolder1.Controls.Add(myUserControl);

Вы получаете эту ошибку, когда у вас есть ссылка типа Control и попытаться назначить UserControl переменная без приведения:

UserControl myUserControl;
myUserControl = LoadControl("~/controls/Editor.ascx");

LoadControl метод возвращает Control ссылка, даже если фактический тип объекта наследует UserControl, Чтобы назначить его UserControl переменная, вам нужно привести ее:

UserControl myUserControl;
myUserControl = (UserControl)LoadControl("~/controls/Editor.ascx");

Тем не менее UserControl класс не имеет ID свойство, к которому вы хотите получить доступ. Чтобы получить доступ к этому вам нужна ссылка на конкретный тип вашего пользовательского элемента управления. Например:

MyEditorControl myUserControl;
myUserControl = (MyEditorControl)LoadControl("~/controls/Editor.ascx");
myUserControl.ID = 42

Или вы можете просто создать конкретную ссылку на лету, чтобы установить свойство:

Control myUserControl;
myUserControl = LoadControl("~/controls/Editor.ascx");
((MyEditorControl)myUserControl).ID = 42;
Другие вопросы по тегам