【发布时间】:2011-09-20 14:46:06
【问题描述】:
阿罗哈,
我有一个自定义控件,我需要从一个类中实例化它并添加到页面中。我的班级有一个函数,我将Page 传递给,所以我可以访问页面上的控件。我正在使用这种方法来添加标准的 ASP 控件,并且它的一切都按预期工作。我的问题是自定义控件的类型是已知定义的?
我阅读了here 以将 .cs 从控件移动到 App_Code 文件夹,但是当我这样做时,它不会编译,因为它看不到 ascx 中的控件有效。例如我得到CS0103: The name 'litTest' does not exist in the current context。因为它们是部分类,所以我在 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 类型:
Control c= Ctrl.LoadControl("~/Controls/CustomControlClass.ascx");
这样做可以让我将控件添加到页面并使其按预期工作。不利的一面是我无法访问任何控件属性。为了解决这个问题,我正在这样做:
c.GetType().GetProperty("myValue").SetValue(c, 1, null);
这行得通,但我不确定它的使用成本有多高。我希望我可以直接施放控件,但尝试时出现错误。
我暂时不回答这个问题,看看是否还有其他选择。
【问题讨论】:
-
您的页面是否正确放置在 default.aspx 页面上?
标签: c# asp.net webusercontrol