2011-04-22 23 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 
using System.Web.Services; 
using System.Text; 
using System.IO; 
using System.Reflection; 

namespace e_compro 
{ 
    public partial class fetchrepeater : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     [WebMethod] 
     public static string Result(string controlName) 
     { 
      // return RenderControl(controlName); 
      Control toreturn = LoadControl(controlName, "hello"); 
      return toreturn; 
     } 

     //public static string RenderControl(string controlName) 
     //{ 
     // Page page = new Page(); 
     // UserControl userControl = (UserControl)page.LoadControl(controlName); 
     // userControl.EnableViewState = false; 
     // HtmlForm form = new HtmlForm(); 
     // form.Controls.Add(userControl); 
     // page.Controls.Add(form); 

     // StringWriter textWriter = new StringWriter(); 
     // HttpContext.Current.Server.Execute(page, textWriter, false); 
     // return textWriter.ToString(); 
     //} 

     public static UserControl LoadControl(string UserControlPath, params object[] constructorParameters) 
     { 
      List<Type> constParamTypes = new List<Type>(); 
      foreach (object constParam in constructorParameters) 
      { 
       constParamTypes.Add(constParam.GetType()); 
      } 

      UserControl ctl = Page.LoadControl(UserControlPath) as UserControl; 

      // Find the relevant constructor 
      ConstructorInfo constructor = ctl.GetType().BaseType.GetConstructor(constParamTypes.ToArray()); 

      //And then call the relevant constructor 
      if (constructor == null) 
      { 
       throw new MemberAccessException("The requested constructor was not found on : " + ctl.GetType().BaseType.ToString()); 
      } 
      else 
      { 
       constructor.Invoke(ctl, constructorParameters); 
      } 

      // Finally return the fully initialized UC 
      return ctl; 
     } 


    } 
} 

我已经从受保护的公共静态方法更改为LoadControl方法。我得到这个错误的第一个参数是Webuser控件.ascx文件的位置。调用具有参数错误的WebuserControl -

错误76的对象引用是所必需的非静态字段,方法或属性“System.Web.UI.TemplateControl.LoadControl(字符串)”

回答

0

你给到LoadControl的第一参数是一个Type和它的价值controlName.GetType().BaseType等于System.ObjectcontrolNamestringstring基本类型是object) - >错误类型“System.Object的”不继承“System.Web.UI.Control”因为LoadControl预计一System.Web.UI.Control类型。

你想instanciate控制给它的名字&一些参数。不幸的是,没有版本的LoadControl接受这些参数。幸运的是,实现这一点非常简单。看看这篇文章:A Good Example of Asp.net LoadControl with multiple parameters

+0

让我看看,谢谢。一旦完成,我会再回来。 – 2011-04-22 00:25:53

相关问题