【问题标题】:Can't get to custom control无法访问自定义控件
【发布时间】:2011-01-09 21:48:21
【问题描述】:

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

<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 对象,但似乎这个页面对象没有控制(控件计数为 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;
}

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

【问题讨论】:

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


    【解决方案1】:

    您无法从页面方法中访问页面实例的大多数属性和方法以及页面上的所有控件。为什么?因为页面方法调用不是回发,这意味着它没有经过页面生命周期,视图状态不可用,也没有创建控件。尝试改用 UpdatePanel。

    【讨论】:

    • 我有一个自定义控件(具有内联编辑、jQuery 拖放、添加和删除功能的项目列表)。当客户端进行更改时,必须(ajax)将新状态发布到服务器(控件)。如何从 UpdatePanel 捕获这些事件?在自定义控件中创建 UpdatePanel 会更好吗?我需要这样的东西:当控件上发生某些事件时,具有使 ajax 从客户端发布到服务器的操作的自定义控件。任何想法如何做到这一点?
    • 默认情况下,更新面板内的所有回发控件都会触发部分回发。您还可以将 UpdatePanel 之外的控件作为触发器,或者使用 __doPostBack 使用 javascript 手动触发部分回发。您的控件应该发布一个您可以从页面订阅的事件,然后您可以将代码逻辑放入事件处理程序中。
    【解决方案2】:

    尝试在页面内使用标准控件。
    如果您可以通过 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");
    }
    

    【讨论】:

    • 我可以通过 Page_Load 事件进行控制。我无法从静态 WebMethod 访问它(似乎我从当前 HttpContext 获得的 Page 对象不是真正的 Page 对象:>)...
    【解决方案3】:

    静态成员不能引用实例引用。您需要从类中的其他实例方法传入对 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多