Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск PlaceHolder, внутри Repeater 
V
    Опции темы
Annihilator
Дата 6.11.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Есть страница
Код

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="Repeater1" runat="server">
                <HeaderTemplate> 
                    <table> 
                    <b>Список итераций</b>
                </HeaderTemplate>
                <ItemTemplate>
                    <tr>
                        <td id="Td1" bgcolor="#CCFFCC" runat="server">
                            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
                            <asp:Label runat="server" ID="Label1" Text='<%# Eval("IterId") %>'/>                    
                        </td>
                        <td bgcolor="#CCFFCC">
                        </td>
                    </tr>
                </ItemTemplate>
                <FooterTemplate> 
                    </table>
                </FooterTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
</html>

Пытаюсь найти PlaceHolder1 таким образом, но ничего не выходит. Вроде рекурсия правильна.
Код

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

        FindControl(Page, "PlaceHolder1");
    }
    public Control FindControl(Control OuterCtrl, string RequiredCtrlID)
    {
        if (OuterCtrl == null)
            return null;
        Control ctrl = OuterCtrl.FindControl(RequiredCtrlID);
        Response.Write(OuterCtrl.ToString());
        if (ctrl != null)
            return ctrl;
        foreach (Control c in OuterCtrl.Controls)
        {
           // if (c.con)
            ctrl = FindControl(c, RequiredCtrlID);
            if (ctrl != null)
                return ctrl;
        }
        return null;
    }
}

Подскажите, пожалуйста!

Это сообщение отредактировал(а) Annihilator - 7.11.2008, 09:36


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Idsa
Дата 7.11.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Annihilator, внутри Repeater контролов с таким id будет столько же, сколько и строк, поэтому repater.FindControl() не имеет смысла.
А вот поиск контрола внутри строки - другое дело:
Код

void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      if (e.Item.ItemType == ListItemType.Item)
      {
        PlaceHolder placeHolder = (PlaceHolder) e.Item.FindControl("PlaceHolder");
        ...
      }
    }



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Annihilator
Дата 7.11.2008, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Хм... а можно поподробнее насчет
Цитата(Idsa @  7.11.2008,  04:36 Найти цитируемый пост)
внутри Repeater контролов с таким id будет столько же, сколько и строк,




--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Idsa
Дата 7.11.2008, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Annihilator, ItemTemplate, в котором Вы создаете какой-либо контрол, повторяется столько раз, сколько элементов баиндится. Тем не менее элементы остаются уникальными благодаря использованию ClientId и UniqueId. Вот пример того, во что рендерится Repeater:
Код

        <input name="Repeater$ctl00$Label" type="text" value="123" id="Repeater_ctl00_Label" />
      
        <input name="Repeater$ctl01$Label" type="text" value="123" id="Repeater_ctl01_Label" />
      
        <input name="Repeater$ctl02$Label" type="text" value="123" id="Repeater_ctl02_Label" />

Control.UniqueId рендерится в свойство name и используется при постбэке. Control.ClientId рендерится в свойство id и используется в JS.

Это сообщение отредактировал(а) Idsa - 7.11.2008, 06:48


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Annihilator
Дата 7.11.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Цитата(Idsa @  7.11.2008,  10:47 Найти цитируемый пост)
Annihilator, ItemTemplate, в котором Вы создаете какой-либо контрол, повторяется столько раз, сколько элементов баиндится.

Это я понимаю. Id будут одинаковы. 
Код

<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

т.е. получается, что я смогу динамически помещать только в первый из трёх PlaceHolder1. Но почему я его найти не могу, ведь он есть в Repeater`e. Я ведь находил другие элементы.
Не могу уловить и все тут :( Ведь что-то же он ищет FindControl()`ом

Это сообщение отредактировал(а) Annihilator - 7.11.2008, 09:37


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Idsa
Дата 7.11.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Annihilator @  7.11.2008,  13:33 Найти цитируемый пост)
Не могу уловить и все тут :( Ведь что-то же он ищет FindControl()`ом

Для начала обратимся к MSDN с вопросом, что же в действительности делает FindControl:
Цитата

Searches the current naming container for a server control with the specified id parameter. 

Теперь смотрим описание свойства Control.NamingContainer:
Цитата

Gets a reference to the server control's naming container, which creates a unique namespace for differentiating between server controls with the same Control..::.ID property value. 

NamingContainer - это класс, реализующий интерфейс INamingContainer. В случае Repeater'а NamingContainer'ом является RepeaterItem.

По этому вопросу есть отличная статья: http://dotnetslackers.com/ASP_NET/re-51209...d_controls.aspx Раздел "The usual scenarios this information is needed in" must read.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Annihilator
Дата 7.11.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: нет
Всего: 3



Огромное спасибо за статью. Уже читаю.


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.