Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
????????? ???????????????? ??????. ?? ?????? ???????????????? ??????? ?????????? (ascx) ??????? ????? ? ??? ? ????? ...\Template\CONTROLTEMPLATES ? ?? ????????????? ? ??????, ? ????????????? "?? ????". ?????? ???? ????? ?????? ??????? ???-?????, ??????? ???????? ? ???? ???? ??????? ?????????? ? ???????? ??? ??????????? ?????????.
? ???? ????????? ????????? ?????????:
public
class TestWebPart : System.Web.UI.WebControls.WebParts.WebPart{
private int pageSize = 25;
[WebBrowsable(
true),
Personalizable(PersonalizationScope.Shared),
DefaultValue(
"25"),
Category(
" "),
FriendlyNameAttribute(
"- "),
XmlElement(ElementName =
"PageSize")]
public int PageSize{get{return pageSize;}set{pageSize = value;}}
protected override void OnInit(EventArgs e){
base.OnInit(e);
this.ExportMode = WebPartExportMode.All;
UserControl ctrl = LoadControl("~/_controltemplates/TestUserControl.ascx", new object[1] { PageSize });
if (ctrl != null){this.Controls.Add(ctrl);}
}
private 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;
ConstructorInfo constructor = ctl.GetType().BaseType.GetConstructor(constParamTypes.ToArray());
if (constructor == null){throw new MemberAccessException("The requested constructor was not found on : " + ctl.GetType().BaseType.ToString());}else{constructor.Invoke(ctl, constructorParameters);}
return ctl;
}
}
Comments
Anonymous
January 01, 2003
Чем больше "л" в слове "компилируется", тем достойней был встречен Новый год. :)Anonymous
January 01, 2003
работает. Читай тему внимательнее. Это как раз тот случай когда весь твой контрол это один ascx. Чего там за экземпляр и интерфейс ты незнаешь. Контрол не в сборке. Сослаться в сборке на него или привести к какому-то типу неудастся. У тебя просто веб-часть не скомпиллируется.Anonymous
January 01, 2003
первая эт не сборка и в ней нет референсов. Это просто набор папокконтроловxml'ников. И превращать это в сборку незачем вообще. сделать надо было малой кровью. Вытаскивать один контрол в другую сборку не красиво.Anonymous
January 01, 2003
что-то в этом есть ) спасибки!Anonymous
January 01, 2003
The comment has been removedAnonymous
January 03, 2010
Тань, а оно работает? Вообще ConstructorInfo.Invoke возвращает экземпляр класса, связанного с конструктором. Почему по-человечески нельзя параметры передать, приведя контрол к известному интерфейсу и вызвав у него метод .LoadParameters, например?Anonymous
January 03, 2010
Ну а конструктор ты знаешь? Имхо некошерно после создания экземпляра контрола вызывать его конструктор, который еще и не без параметров, что для контролов вообще нестандартно. Можно пример привести такого контрола, а-то я в ситуацию не въезжаю.Anonymous
January 03, 2010
Да я понял и структуру и зачем это, почему нельзя в DLL вытащить :-) И уже даже понял, почему оно работает. В данном случае вызывается Invoke класса MethodInfo (он не переопределяется в ConstructorInfo). В общем, я лично сильно против вызовов конструктора уже созданного экземпляра через рефлексию, и против конструкторов с параметрами для .ascx-контролов. Если мы можем править сам контрол, который мы оборачиваем в веб-часть, я бы сделал в общей для этих двух сборок интерфейс, к которому бы приводил контрол и вызывал метод с установкой параметров.Anonymous
January 04, 2010
The comment has been removed