C# Can';无法访问自定义控件
我的web窗体上有一个自定义控件:C# Can';无法访问自定义控件,c#,asp.net,controls,webforms,custom-controls,C#,Asp.net,Controls,Webforms,Custom Controls,我的web窗体上有一个自定义控件: <form id="form" runat="server"> <clc:CustomList ID="myList" runat="server" AddButtonText="add" DeleteButtonText="del" MoveUpButtonText="up" MoveDownButtonText="down"/
<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获取页面对象,但是这个页面对象似乎没有控件(控件计数为0)
[WebMethod]
公共静态列表GetListItems()
{
Page Page=HttpContext.Current.Handler作为页面;
控制=空;
如果(第页!=null)
{
control=FindControlRecursive(第页,“myList”);
}
返回null;
}
私有静态控件FindControlRecursive(控件根,字符串id)
{
if(root.ID==ID)
{
返回根;
}
foreach(root.Controls中的控件c)
{
控件t=FindControlRecursive(c,id);
如果(t!=null)
{
返回t;
}
}
返回null;
}
知道为什么或者如何控制我吗?
谢谢 尝试在页面内使用标准控件。
如果您可以通过ID找到它,那么您可能在注册自定义控件时出错(也许您可以提供所有的aspx代码?)。
还要注意,
Page
类有一个内置的FindControl
方法
例如,这应该起作用:
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</form>
无法从page方法中访问page实例的大多数属性和方法以及该页上的所有控件。为什么?由于page方法调用不是回发,这意味着它不会经历页面生命周期,因此viewstate不可用,并且不会创建控件。尝试改用UpdatePanel。静态成员不能引用实例引用。您需要从类中的其他实例方法传入对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;
}
受保护的无效页面加载(对象发送方,事件参数e){
var tb=GetListItems(此项);
}
[网络方法]
公共静态列表GetListItems(System.Web.UI.Page)
{
var c=null;
如果(第页!=null)
{
c=page.FindControl(“myList”);
}
返回c;
}
我可以通过页面加载事件进行控制。我无法从静态WebMethod访问它(似乎我从当前HttpContext获得的页面对象不是真正的页面对象:>)…我有一个自定义控件(具有内联编辑、jQuery拖放、添加和删除功能的项目列表)。当客户端进行更改时,必须将新状态(ajax)发布到服务器(控件)。如何从UpdatePanel捕获这些事件?在自定义控件中创建UpdatePanel是否更好?我需要这样的东西:带有操作的自定义控件,当控件上发生某些事件时,这些操作使ajax从客户端发布到服务器。有什么办法吗?默认情况下,更新面板中的所有回发控件都会触发部分回发。您还可以将UpdatePanel之外的控件作为触发器,或者使用_doPostBack使用javascript手动触发部分回发。您的控件应该发布一个事件,您可以从页面订阅该事件,然后您可以将代码逻辑放入事件处理程序中。
protected void Page_Load(object sender, EventArgs e) {
var tb = FindControl("TextBox1");
}
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;
}