Не удается получить пользовательский контроль - PullRequest
0 голосов
/ 27 января 2010

У меня есть пользовательский элемент управления в моей веб-форме:

<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. Я получаю объект Page из текущего HttpContext, но, похоже, у этого объекта страницы нет контролов (количество элементов управления равно 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 ]

1 голос
/ 28 января 2010

Вы не можете получить доступ к большинству свойств и методов экземпляра страницы и всех элементов управления на странице из метода страницы. Зачем? Поскольку вызов метода страницы не является обратной передачей, что означает, что он не проходит жизненный цикл страницы, состояние представления недоступно и элементы управления не создаются. Попробуйте вместо этого использовать UpdatePanel.

0 голосов
/ 28 января 2010

Статические члены не могут ссылаться на ссылки на экземпляры. Вам нужно будет передать ссылку на HttpContext или саму страницу из какого-либо другого метода экземпляра в классе. Я бы сказал, что вам нужно вызвать статический веб-сервис с таким параметром:

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;
}
0 голосов
/ 27 января 2010

Я публикую вот так, чтобы добавить код ...

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

Есть идеи, почему?

0 голосов
/ 27 января 2010

Попробуйте со стандартным элементом управления внутри страницы.
Если вы можете найти его по идентификатору, значит, вы, возможно, сделали что-то не так, зарегистрировав свой пользовательский элемент управления (возможно, вы могли бы предоставить весь код 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");
}
...