Область управления в Repeater, с и без UpdatePanel - PullRequest
2 голосов
/ 12 февраля 2009

Почему следующее дает мне ошибку компиляции для строки B (Label2, вне UpdatePanel), но не для строки A (Label1, внутри UpdatePanel)? Я ожидал, что обе строки выдают ошибку, поскольку оба элемента управления находятся в одном и том же повторителе и поэтому не должны быть непосредственно доступны за пределами повторителя, поскольку не существует ни одного уникального экземпляра.

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Label1.ClientID;  // Line A - compiles fine
        Label2.Text = Label2.ClientID;  // Line B - "The name 'Label2' does not exist in the current context"
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Repeater runat="server" ID="Repeater1">
                <ItemTemplate>
                    <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                        <ContentTemplate>
                            <asp:Label ID="Label1" runat="server" Text="Label1" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                    <asp:Label ID="Label2" runat="server" Text="Label2" />
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
</html>

Ответы [ 3 ]

1 голос
/ 12 февраля 2009

Держу пари, если вы закомментируете строку B, вы получите ошибку во время выполнения. Label1 будет пустой ссылкой.

Когда вы создаете элементы управления на странице ASPX, Visual Studio пытается помочь вам, добавляя элементы управления к коду в файле конструктора, который расширяет класс для страницы. В этом случае это добавляет один, когда это не должно быть.

Короткий ответ - это ошибка. Вы должны отправить его, но это не должно быть проблемой блокировки.

0 голосов
/ 06 марта 2009

Ни то, ни другое не подходит. Вы не должны пытаться напрямую ссылаться на элемент управления, который содержится в ItemTemplate.

Если вы хотите изменить эти метки во время выполнения, вы должны использовать OnItemDataBound и FindControl. Чтобы «найти» метку в панели обновления, вам нужно использовать UpdatePanel.ContentTemplateContainer.FindControl ().

0 голосов
/ 12 февраля 2009

Реальный вопрос: почему вы создаете несколько панелей обновления в ретрансляторе? Поместите один снаружи повторителя и назовите это хорошим. Или, если вы просто хотите обновить текст, не используйте панель обновления, используйте обратный вызов с некоторым клиентским скриптом для установки элемента dom. Проверьте это http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...