2010-10-20 9 views
0

Je tente de charger usercontrol dans C#.Impossible de convertir le type 'System.Web.UI.Control' en 'System.Web.UI.UserControl

pouvez ajouter le .ascx sur ma page .aspx en utilisant le code ci-dessous:

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

Cependant, je veux passer ID dans Editor.ascx, haut de la Editor.ascx contient les éléments suivants Code:

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

} 

J'ai essayé de coulée contrôle pour le contrôle de l'utilisateur que je peux avoir accès à ID voir ci-dessous

UserControl Edit = (UserControl)MyUserControl; 

Mais je reçois une erreur de distribution.

des idées?

+0

je suis confus, pourquoi n'êtes-vous pas tout comme déclarez usercontrol? – Andrey

+0

Le code que vous affichez et le message d'erreur que vous affichez ne correspondent pas. Vous n'effectuez aucune conversion implicite vers UserControl. Vous effectuez une conversion explicite, et si cela échouait, cela se produirait au moment de l'exécution et ne pourrait pas donner une erreur de compilation. – Guffa

Répondre

1

Je pense que votre problème est votre casting lorsque vous chargez le contrôle. Vous devez convertir le type le plus spécifique (dans ce cas, Editor), transmettre les paramètres dont vous avez besoin, puis ajouter le contrôle à l'espace réservé.

Essayez ceci:

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

Pouvez-vous expliquer pourquoi cela fonctionne? J'ai fait un commentaire similaire moi-même (apparemment 6 minutes après cette réponse, donc je vais le supprimer maintenant) mais je ne pouvais pas comprendre pourquoi cela fonctionnerait alors que ce que l'affiche originale ne fonctionne pas. Je suppose que ce qui est retourné par LoadControl * est * un éditeur et si c'est un contrôle en premier il devrait être possible de le mettre ensuite dans un contrôle utilisateur. En supposant bien sûr que l'éditeur met en œuvre définitivement UserControl ... – Chris

0

Vous obtenez cette erreur lorsque vous avez une référence de type Control et essayer d'assigner à une variable UserControl sans coulée:

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

La méthode LoadControl retourne un Control référence même si le type réel de l'objet hérite UserControl. Pour assigner à une variable UserControl vous devez jeter:

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

Cependant, la classe UserControl n'a pas la propriété ID que vous souhaitez accéder. Pour y accéder, vous avez besoin d'une référence du type spécifique de votre contrôle utilisateur. Par exemple:

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

Ou vous pouvez simplement créer la référence spécifique à la volée pour définir la propriété:

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