无法将类型'System.Web.UI.Control'隐式转换为'System.Web.UI.UserControl

时间:2010-10-20 15:56:26

标签: c# webusercontrols

我正在尝试在c#中加载usercontrol。

可以使用以下代码将.ascx添加到我的.aspx页面:

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

但是,我想将 ID 传递给Editor.ascx,编辑器的顶部.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 个答案:

答案 0 :(得分:1)

我认为你的问题是你加载控件时的转换。您应该转换为最具体的类型(在本例中为Editor),传递所需的参数,然后将控件添加到占位符。

试试这个:

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

答案 1 :(得分:0)

如果您的引用类型为Control,并且尝试在不进行转换的情况下分配给UserControl变量,则会出现该错误:

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

即使对象的实际类型继承LoadControlControl方法也会返回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;