无法进行自定义控制

时间:2010-01-27 10:42:07

标签: c# asp.net controls webforms custom-controls

我的网络表单上有自定义控件:

<form id="form" runat="server">
      <clc:CustomList 
        ID="myList" 
        runat="server" 
        AddButtonText="add"
        DeleteButtonText="del"
        MoveUpButtonText="up"
        MoveDownButtonText="down"/>
        <div id="test" runat="server"></div>
</form>

我需要从静态WebMethod获取此控件。 我从当前的HttpContext中获取了Page对象,但似乎这个页面对象没有contorls(控件计数为0)。

[WebMethod]
public static List<CustomListControl.IListItem> GetListItems()
{
    Page page = HttpContext.Current.Handler as Page;

    Control control = null;

    if (page != null)
    {
        control = FindControlRecursive(page, "myList");
    }
    return null;
}

private static Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    }

    return null;
}

知道为什么或如何控制我? 谢谢!

4 个答案:

答案 0 :(得分:1)

您无法从Page Method中访问页面实例的大多数属性和方法以及页面上的所有控件。为什么?因为页面方法调用不是回发,这意味着它不会经历页面生命周期,viewstate不可用,并且不会创建控件。请尝试使用UpdatePanel。

答案 1 :(得分:0)

尝试使用页面内的标准控件 如果您可以通过ID找到它,那么您可能在注册自定义控件时出错了(也许您可以提供所有的aspx代码?)。
另请注意,Page类具有内置FindControl方法。

例如,这应该有效:

<form id="form1" runat="server">
<div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</form>

并在.cs文件中:

protected void Page_Load(object sender, EventArgs e) {
    var tb = FindControl("TextBox1");
}

答案 2 :(得分:0)

我这样发帖所以我可以附加代码......

ASPX:

<%@ Register Assembly="CustomListControl" Namespace="CustomListControl" TagPrefix="clc" %>
<%@ Import Namespace="System.Web.Services" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head" runat="server">
    <title>MyList</title>
</head>
<body>
    <form id="form" runat="server">
        <clc:CustomList 
            ID="myList" 
            runat="server" 
            AddButtonText="add"
            DeleteButtonText="del"
            MoveUpButtonText="up"
            MoveDownButtonText="down"/>
            <div id="test" runat="server"></div>
    </form>
</body>
</html>

即使我这样做

[WebMethod]
public static List<CustomListControl.IListItem> GetListItems()
{
    Page page = HttpContext.Current.Handler as Page;

    if (page != null)
    {
        var c = page.FindControl("myList");
    }
    return null;
}

我得到c = null;我无法从这个页面对象找到甚至表单控件...

如果我执行var c = this.FindControl(“myList”)是页面加载事件,我会进入控件。问题是因为我无法控制静态WebMethod ...

知道为什么吗?

答案 3 :(得分:0)

静态成员无法引用实例引用。您需要从类中的其他实例方法传入对HttpContext或页面本身的引用。我要说你需要使用如下参数调用静态Web服务:

protected void Page_Load(object sender, EventArgs e) {
    var tb = GetListItems(this);
}

[WebMethod]
public static List<CustomListControl.IListItem> GetListItems(System.Web.UI.Page page)
{
    var c = null;    

    if (page != null)
    {
        c = page.FindControl("myList");
    }
    return c;
}