gpt4 book ai didi

c# - 使用什么方法可以在初始化之前动态设置 ASPX 控件属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:04 25 4
gpt4 key购买 nike

我需要配置我编写的自定义控件的属性,特别是在控件调用 OnInit 之前。如果我将它分配为 ASPX 文件的一部分,它自然会起作用,但如果我将分配移动到代码隐藏的不同部分,它将抛出一个空值和无效值的错误。以下是在 ASPX 页面中运行时的样子。

<MyCustomControls:SingleCascadeLookupMulti FilterString="Seventh" FilterByStatus="true" ControlMode="New" FieldName="Speciality" EnableViewState="true" ID="sclmDocuments" runat="server" TemplateName="SingleCascadeLookupMulti" />

有问题的属性是 FilterString,它只是一个简单的字符串。还应该注意的是,FieldName属性(继承自控件的基类“BaseFieldControl”)如果未初始化也会抛出错误,但如果我设置FieldName 在代码隐藏的 OnInit 方法中,它工作正常。 FilterString 不是这样,它实际上不会被分配。所以我知道某些属性的某些方法可以用于设置属性的值,但它并不总是有效。我也尝试将它放在 OnPreInit 中,但无济于事。

我正在采用动态分配方法,因为需要为许多不同的列表复制此页面的功能,并且 FilterStringFieldName 属性将有所不同每一个案例。与其编写半打几乎完全相同的 aspx 页面,所有这些页面都使用相同的代码,只是这两个属性不同,我认为使用页面的查询字符串和一些派生参数来动态设置这些属性会更明智。那么,有哪些方法可以完成这个任务?

最佳答案

我用来执行此操作的一种方法是在控件中创建一个构造函数,该构造函数采用我需要设置的参数(在您的例子中是 FilterString)。然后,我使用以下函数动态加载控件,并向其传递参数:

protected UserControl LoadControl(string UserControlPath, params object[] constructorParameters)
{
List<System.Type> constParamTypes = new List<System.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;
}

然后像这样调用方法:

Control ctlToAdd = this.LoadControl("UserControls/MyControl.ascx", Parameter1, "Parameter2");
MyDiv.Controls.Add(ctlToAdd);

关于c# - 使用什么方法可以在初始化之前动态设置 ASPX 控件属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2868629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com