Проблема с FindControl - PullRequest
       14

Проблема с FindControl

0 голосов
/ 10 августа 2009

Я создал строку (строку заголовка) в виде сетки с выпадающим списком среди других элементов управления вводом. Я также поместил кнопку в этом ряду (fltbttn-смотрите ниже). Я создал addhandler для кнопки с именем fltbttn_Click. Я хочу получить доступ к своему раскрывающемуся списку (ddlscantype) с помощью findcontrol, но как мне попасть в строку заголовка, где существуют элементы управления фильтрами?

   Dim fltbttn As New ImageButton
   fltbttn.ImageUrl = "\images\bttnFilter.gif"
   AddHandler fltbttn.Click, AddressOf fltbttn_Click
   Dim cell As New TableCell
   Dim row As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)
   Dim ddlscantype As New DropDownList
    AddHandler ddlscantype.SelectedIndexChanged, AddressOf ddlscantype_Changed
    ddlscantype.DataSource = SqlDataSource2
    ddlscantype.DataValueField = "value"
    ddlscantype.DataTextField = "name"
    ddlscantype.DataBind()
   row.Cells.Add(cell)
   cell.Controls.Add(ddlscantype)

MARKUP

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate >
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF" 
            BorderStyle="None" BorderWidth="1px" CellPadding="3" 
            DataSourceID="SqlDataSource1" Font-Names="Estrangelo Edessa" Font-Size="Small" 
            ShowFooter="True"
            Caption = '<table border="" width="100%" cellpadding="3" cellspacing="0" bgcolor="#4A3C8C"><tr><td style = "font-size:X-large;font-family:Arial CE;color:White"><b>Receiving Error Log</u></td></tr></table>' >
            <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
            <Columns>
                <asp:BoundField DataField="scan" HeaderText="Scan" SortExpression="scan" />
                <asp:BoundField DataField="ScanType" HeaderText="ScanType" ReadOnly="True" 
                    SortExpression="ScanType" />
                <asp:BoundField DataField="Vendor" HeaderText="ht" ReadOnly="True" 
                    SortExpression="ht" />
                <asp:BoundField DataField="Name" HeaderText="ht2" ReadOnly="True" 
                    SortExpression="ht2" />
            </Columns>
            //footer style and pager style blah blah blah goes here.
            </ContentTemplate> 
    </asp:UpdatePanel>
    <ajaxToolkit:UpdatePanelAnimationExtender ID="upae" BehaviorID ="animation" runat="server" TargetControlID = "UpdatePanel1" >
         <Animations >
            <OnUpdating>
                <Parallel duration="0">
                  <ScriptAction Script="onUpdating();" />
                </Parallel>
            </OnUpdating>
            <OnUpdated>
                <Parallel duration="0">
                <ScriptAction Script="onUpdated();" /> 
                </Parallel>
            </OnUpdated>    
         </Animations>

Ответы [ 2 ]

1 голос
/ 10 августа 2009

Почему вы не используете тип TemplateField для одного из столбцов данных, а затем используете шаблонный заголовок?

например:

<asp:TemplateField>
    <ItemTemplate>
    <%# Eval("Vendor") %>
    </ItemTemplate>
    <HeaderTemplate>
    <asp:DropDownList ID="ddlscantype" runat="server" DataSourceID="SqlDataSource2" DataTextField="name" DataValueField="id" OnSelectedIndexChanged="YourCallbackMethod" />        
    </HeaderTemplate>
</asp:TemplateField>

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

Не забудьте подключить ваше мероприятие здесь ...

1 голос
/ 10 августа 2009

Ну, первое, что бросается в глаза, это то, что вы динамически создали свой DropDownList ... но вы создали его внутри функции.

Вы должны иметь в виду, что переменные / объекты имеют область видимости. Область вашего DropDownList находится внутри функции, которую вы объявили. Это означает, что он будет добавлен на страницу и обработан, но как только он будет завершен, он будет уничтожен. Когда пользователь вызывает обратную передачу на сервер, DropDownList больше не существует ... и поэтому событие никогда не сработает.

Вы должны предоставить DropDownList область действия всей страницы. Объявите это на уровне страницы.

Другая вещь, которую вы должны иметь в виду при использовании динамических элементов управления, это жизненный цикл ASP-страницы.

Страница размещена на сервере ...

Сервер создает все объекты, необходимые для выполнения серверных вычислений в событии инициализации страницы ....

Сразу после события инициализации страницы для страницы загружается ViewState ... ViewState используется для определения того, какие события вызвали обратную передачу.

Если ваш DropDownList не существует, когда ViewState загружен для элемента управления, событие будет потеряно, и ваш код не будет обрабатывать его.

Я рекомендую вам избегать использования динамических элементов управления. Иногда вы должны использовать их ... но они не просты в использовании.

Я написал небольшую статью об использовании динамических элементов управления ASP.NET , которые могут помочь вам лучше понять.

-Frinny

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