无法连接到自定义控件

问题描述:

我有我的web窗体上的自定义控件:无法连接到自定义控件

<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; 
} 

任何想法为什么或如何得到我的控制? 谢谢!

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

我可以从Page_Load事件中进行控制。我无法从静态WebMethod达到它(看起来像我从当前HttpContext获得的页面对象不是真正的页面对象:>)... – Heko 2010-01-27 13:45:30

我张贴这样的,所以我可以添加代码...

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 ...

任何想法为什么?

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

+0

我有一个自定义控件(内联编辑项目列表,jQuery拖放,添加和删​​除功能)。当客户端进行更改时,必须将新状态(ajax)发布到服务器(控制)。如何从UpdatePanel捕获这些事件?在自定义控件中创建UpdatePanel会更好吗? 我需要这样的东西:自定义控件的操作,当控件发生一些事件时,从客户端到服务器发出ajax帖子。任何想法如何做到这一点? – Heko 2010-01-28 08:32:10

+0

默认情况下,更新面板中的所有回发控件都将触发部分回发。您还可以将UpdatePanel外部的控件用作触发器,或者使用__doPostBack手动触发使用javascript的部分回发。您的控件应该发布一个事件,您可以从该页面订阅,然后可以将您的代码逻辑放入事件处理程序中。 – 2010-01-28 16:37:06

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