поиск элемента управления в дереве коллекции

я добавляю динамический элемент управления (текстовое поле) и устанавливаю для свойства значение visible = false, но я не нахожу элемент управления в коллекции дерева, я хочу скрыть его от пользователя, увидевшего его, и прочитать значение.

protected void gv_RowCreated(object sender, GridViewRowEventArgs e)
    {
       Students org = (namespace.Students )(e.Row.DataItem);

       foreach (Registration reg in org.Registrations)
       {
          int _count = org.Registrations.Count;
          for (int rowId = 0; rowId < _count; rowId++)
          {
             TextBox txtBox = new TextBox();
             txtBox.ID = "_registration" + e.Row.RowIndex + "_" + rowId;
             txtBox.Text = reg.Name;
             txtBox.Visible = true;
             e.Row.Cells[7].Controls.Add(txtBox);
         }
       }
    }

person Nick Kahn    schedule 26.01.2011    source источник
comment
Вы не должны добавлять Row.RowIndex к идентификатору вашего текстового поля. NamingContainer для каждого элемента управления в GridViewRow — это сам GridViewRow. Поэтому вы можете и должны использовать тот же идентификатор в следующей строке.   -  person Tim Schmelter    schedule 26.01.2011
comment
я уже использую e.row.rowindex   -  person Nick Kahn    schedule 26.01.2011
comment
@Time, я разместил здесь, почему я в конечном итоге использую, может быть, вы можете пролить свет? stackoverflow.com/questions/4798644/   -  person Nick Kahn    schedule 26.01.2011
comment
Если вы используете HtmlInputHidden, вам не нужно устанавливать visible = false   -  person XtremeBytes    schedule 26.01.2011


Ответы (3)


Поскольку вы создаете TextBoxes на основе org.Registrations, вы можете использовать Repeater в ItemTemplate GirdVIew, а затем привязать org.Registrations как DataSource к повторителю в событии RowCreated. то есть: в вашем aspx:

<asp:GridView ...... OnRowDataBound="gv_RowDataBound">
.
.
.
    <asp:TemplateField ...>
        <ItemTemplate>
            <asp:Repeater id="rptRegistrations" runat="server">
                <asp:TextBox id="txtRegistration" runat="server" Text='<%#Eval("Name")%>'></asp:TextBox><br/>
            </asp:Repeater>
        </ItemTemplate>
    </asp:TemplateField ...>
</asp:GridView>

в вашем коде

      protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)     
        {        
         if(e.Row.RowType == DataControlRowType.DataRow)
    {
             Students org = (namespace.Students )(e.Row.DataItem);         
             Repeater rptrRegistrations = e.Row.Cells[7].FindControl("rptrRegistrations") as Repeater ;
             rptrRegistrations.DataSource = org.Registrations;
             rptrRegistrations.DataBind();
         } 
        }

 public void gv_SelectedIndexChanged(Object sender, EventArgs e)
  {

    // Get the currently selected row using the SelectedRow property.
    GridViewRow row = gvOrg.SelectedRow;
        Repeater rptrRegistrations = row.Cells[7].FindControl("rptrRegistrations") as Repeater;
        foreach(RepeaterItem item in rptrRegistrations.Items)
        {
            TextBox txtRegistration = item.FindControl("txtRegistration") as TextBox;
            //Now you have access to the textbox.
        }
  }

Игнорировать следующий текст на основе комментария OP

Вместо динамического создания TextBox добавьте текстовое поле в Grid ItemTemplate в ASPX, а затем используйте e.Row.Cells.FindControl для доступа к текстовому полю. Что-то типа:

protected void gv_RowCreated(object sender, GridViewRowEventArgs e)     
{        
    Students org = (namespace.Students )(e.Row.DataItem);         
    foreach (Registration reg in org.Registrations)        
    {           
        int _count = org.Registrations.Count;           
        for (int rowId = 0; rowId < _count; rowId++)           
        {              
            TextBox txtBox = e.Row.Cells[7].FindControl("txtRegistration") as TextBox ;
            //txtBox.ID = "_registration" + e.Row.RowIndex + "_" + rowId;              
            txtBox.Text = reg.Name;              
            txtBox.Visible = true;              
            //e.Row.Cells[7].Controls.Add(txtBox);          
        }        
    }     
} 
person Chandu    schedule 26.01.2011
comment
я бы хотел, чтобы я мог использовать, но у меня есть ситуация, когда мне нужно создать динамический контроль, и я уже разместил вопрос здесь stackoverflow.com/questions/4798644/ - person Nick Kahn; 26.01.2011
comment
Обновил сообщение. Возможно, вам придется немного изменить опубликованный код в соответствии с вашими потребностями.. Но это дает вам представление.. - person Chandu; 26.01.2011
comment
@Cybernate: если вы посмотрите на мой код, и я выполняю оператор цикла for для создания # текстового поля на основе того, сколько счетчиков я получаю из БД, но глядя на ваш код, у вас есть декларативное текстовое поле на странице .aspx.... i Интересно, как это поможет в моей ситуации? - person Nick Kahn; 26.01.2011
comment
мне нужно что-то более динамичное - person Nick Kahn; 26.01.2011
comment
Вы привязываете регистрации к повторителю, который, в свою очередь, отображает текстовые поля на основе элементов в регистрациях. Попробуйте код, и вы поймете, как только увидите, что он работает... - person Chandu; 26.01.2011
comment
Это все еще динамическое текстовое поле, обернутое в элемент управления повторителем, который повторяет внутренний шаблон столько раз, сколько элементов в источнике данных привязано к нему. - person Chandu; 26.01.2011
comment
получение null Repeater rptrRegistrations = e.Row.Cells[7].FindControl("rptRegistrations") as Repeater; и двойная проверка того, что ячейки [7] - это место, где у меня есть мой шаблон для повторителя - person Nick Kahn; 26.01.2011
comment
Вам нужно проверить, является ли текущая строка DataRow в обработчике событий RowCreated, а также настроить обработчик для обработки OnRowDataBound. Проверьте обновленный пост. - person Chandu; 26.01.2011
comment
я пробовал как с OnRowCreated, так и с OnRowDataBound и все еще получаю null, когда я отлаживал, я сделал что-то вроде этого e.Row.Cells[7].Text я получаю следующее `\r\n‹asp:Repeater id=\rptRegistrations\ › \r\n ‹asp:TextBox id =\txtRegistration\ /› \r\n ‹/asp:Repeater›\r\n ` - person Nick Kahn; 26.01.2011
comment
Можете ли вы опубликовать часть aspx для используемого вами GridView? - person Chandu; 26.01.2011
comment
runat=Server отсутствует для элемента управления Repeater и внутреннего элемента управления TextBox. Также присвоение атрибута Text элементу управления TextBox для заполнения свойства Name, т.е. - person Chandu; 26.01.2011
comment
вот что я получаю сообщение об ошибке: после добавления runat="server" Type 'System.Web.UI.WebControls.Repeater' нет общедоступного свойства с именем 'TextBox'.` - person Nick Kahn; 26.01.2011
comment
@Abu: Ответ, который я дал, состоит в том, чтобы дать вам представление о динамическом повторении текстового поля. В файле aspx отсутствует тег ItemTemplate внутри Repeater и перед ‹asp:TextBox. Убедитесь, что вы правильно отредактировали aspx, а затем попытайтесь принять предложение. - person Chandu; 26.01.2011
comment
Спасибо Cybernate, и последнее, как я могу прочитать эти текстовые поля, созданные динамически? - person Nick Kahn; 26.01.2011
comment
Обновил сообщение с примером метода по имени: gv_SelectedIndexChanged Проверьте код (опять же, чтобы дать вам некоторое представление, при необходимости внесите синтаксические исправления) - person Chandu; 26.01.2011
comment
пока я тестировал, я обнаружил, что если я устанавливаю <asp:TemplateField visible=false ...., то я не получаю никакого текстового значения `TextBox txtRegistrationId = item.FindControl(txtRegistrationId) as TextBox;` он пуст, и если я устанавливаю visible=true в файле шаблона, я получаю значение, любые предложения? - person Nick Kahn; 27.01.2011
comment
Почему вы устанавливаете для свойства Visible значение false? Разве это не должно быть видно конечному пользователю? Если да, используйте asp:HiddenField вместо asp:TextBox - person Chandu; 27.01.2011
comment
причина, по которой я использую, заключается в том, чтобы получить regId, я попробую hiddenfield. - person Nick Kahn; 27.01.2011

Я считаю, что размещение Visible="false" в элементе управления с остановкой его рендеринга в браузере, поэтому нет, вы его не найдете.

Вместо этого вы можете попробовать использовать элемент управления HtmlInputHidden, который создаст скрытое поле ввода.

Скрытые поля не лучший способ сделать что-то, так как они могут быть довольно легко изменены на стороне клиента с помощью различных инструментов перехвата.

person Dark Hippo    schedule 26.01.2011

Если visible равно false, оно не будет отображаться на странице. Также для вашего требования может использоваться элемент управления HTMLInputHidden.

person XtremeBytes    schedule 26.01.2011