你好,
我有一个自定义控件需要在类内实例化并添加到页面中。我的类有一个函数,我将Page
传递给它,以便可以访问页面上的控件。我已经使用这种方法添加了标准ASP控件,一切都按预期工作。我的问题是自定义控件的类型未定义?
我在这里读到,将.cs文件从控件移动到App_Code文件夹中,但当我这样做时,它无法编译,因为它无法将ascx中的控件视为有效控件。例如,我会得到CS0103:当前上下文中不存在名称“litTest”
。因此,由于它们是部分类,我在App_Code文件夹中创建了一个新的空部分类,并保留了控件的.cs文件。
这样编译就可以了,但是当我将控件添加到Page.controls集合中时,在应该出现的位置上看不到任何东西。例如,我在ascx文件底部添加了TEST
,但在页面上看不到它。此外,控件具有我需要设置的变量,但在使用空部分类时我无法访问它们。
我知道我尝试做的事情对于标准控件是有效的,为什么我似乎无法使自定义控件起作用呢?
我在App_Code文件夹中的部分类:
public partial class CustomControlClass : System.Web.UI.UserControl
{
}
我的部分类是为用户控件而设计的:
public partial class CustomControlClass : System.Web.UI.UserControl
{
private int _myValue= -1;
public int myValue
{
get { return _myValue; }
set { _myValue= value; }
}
protected void Page_Init(object sender, EventArgs e)
{
litTest.Text = "TEST";
}
}
我的用户控件ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControlClass.ascx.cs" Inherits="CustomControlClass" %>
<asp:Literal ID="litTest" runat="server"></asp:Literal>
TEST
我的 App_Code 类:
public class MyClass
{
public static void doWork(Page Ctrl)
{
CustomControlClass c = new CustomControlClass();
//c.myValue = 1; // Wont compile with this line
Ctrl.Controls.Add(c);
Literal l = new Literal();
l.Text = "HELLO";
Ctrl.Controls.Add(l);
}
}
页面输出中根本没有单词“TEST”。单词“HELLO”显示得很好。我已经尝试从页面的
Load
、Init
和PreInit
回调中调用MyClass.doWork()
,但结果都是一样的。更新:
正如Minh Nguyen建议的那样,我可以使用
Ctrl.LoadControl("~/Controls/CustomControlClass.ascx");
来加载控件,但我不能将其强制转换为自己的类型,我必须将其分配为控件类型:Control c= Ctrl.LoadControl("~/Controls/CustomControlClass.ascx");
这样做可以让我将控件添加到页面并按预期工作。缺点是我无法访问任何控件属性。为解决此问题,我正在执行以下操作:
c.GetType().GetProperty("myValue").SetValue(c, 1, null);
这个方法可以运行,但我不确定使用它会不会很昂贵。我希望可以直接转换控件,但是尝试时出现了错误。
我暂时不回答这个问题,想看看是否有其他的选项。