ссылка на идентификаторы элементов управления из кода, который находится в повторителе

На этой неделе у меня возникла проблема, связанная с попыткой определить, какой элемент управления использовать, чтобы иметь возможность отображать данные из нескольких источников данных без сетки. Благодаря этому форуму я узнал, что лучше всего использовать повторитель с различными элементами управления, такими как метки и таблицы внутри повторителя. Пока не совсем уверен, как я все это реализую, но первое, что мне нужно узнать, это как изменить текст из кода, стоящего за таблицей, и метки, которые у меня будут внутри повторителя. Я прочитал и обнаружил, что следующее должно работать. но это не так.

for (int i = 0; i <= Repeater1.Items.Count - 1; i++)
            {
                Label labelCustomerID = (Label)Repeater1.Items[i].FindControl("labelCustomerID");
                labelCustomerID.Text = "from code Behind";

            }

мой декларативный синтаксис таков:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
    <ItemTemplate>
            <hr/>
            <asp:Label runat="server" ID="labelCustomerId"  />
            <div style="padding-left:150px">
                <asp:Label runat="server" ID="labelCustomerName" />
                <asp:Label runat="server" ID="labelCustomerAddress" />
                <asp:Label runat="server" ID="labelCityState" />    
            </div>
            <asp:GridView runat="server" ID="gridViewRecordData">

            </asp:GridView>
            <hr/>
        </ItemTemplate>
 </asp:Repeater>

Благодаря EdB я зашел так далеко. Еще не уверен, как я собираюсь заполнить gridview одной записью данных, но обо всем по порядку... Мне нужно иметь возможность изменить текст метки. Если я смогу это сделать, я уверен, что все остальное встанет на свои места.

Пожалуйста помогите! :) Делл


person dellbingham    schedule 18.11.2011    source источник
comment
можете ли вы опубликовать весь код вашего файла кода программной части? Я думаю, вы ссылаетесь на ретранслятор до его заполнения.   -  person Shai Cohen    schedule 19.11.2011
comment
Спасибо. Вот оно. Я не понимал, что вам нужно привязать к нему данные, прежде чем вы сможете получить имя элемента управления. Теперь я знаю! ха! благодаря.   -  person dellbingham    schedule 21.11.2011
comment
Я продолжу и опубликую приведенный выше комментарий в качестве ответа, чтобы вопрос можно было закрыть. Пожалуйста, отметьте как ответ. Спасибо.   -  person Shai Cohen    schedule 23.11.2011


Ответы (2)


Попробуйте с этим кодом:

for (int i = 0; i <= Repeater1.Items.Count - 1; i++) 
        {
            if(Repeater1.Items[i].ItemType == ListItemType.Item || Repeater1.Items[i].ItemType == ListItemType.AlternatingItem)
            {
                Label labelCustomerID = (Label)Repeater1.Items[i].FindControl("labelCustomerID"); 
                labelCustomerID.Text = "from code Behind"; 
            }

        } 
person schglurps    schedule 18.11.2011
comment
С кодом, который вы мне дали, я получаю следующую ошибку: Ошибка 9 «объект» не содержит определения для «FindControl», и не может быть найден метод расширения «FindControl», принимающий первый аргумент типа «объект» (вам не хватает используя директиву или ссылку на сборку?) - person dellbingham; 18.11.2011
comment
Спасибо. и мне жаль беспокоить вас. Никаких ошибок, но как отладка, логика никогда не попадает в цикл for. Причина в том, что Repeater1.Items.Count равен 0 при загрузке страницы. Должен ли я взять минус 1??? - person dellbingham; 18.11.2011
comment
Не бери в голову. Я убрал минус 1 и получил индекс вне диапазона оператора IF. Я делаю что-то не так. Должно быть проще изменить текст элементов управления внутри повторителя. - person dellbingham; 19.11.2011

Я думаю, вы ссылаетесь на ретранслятор до его заполнения.

person Shai Cohen    schedule 22.11.2011