FindControl问题

时间:2009-08-10 13:46:57

标签: c# asp.net vb.net visual-studio gridview

我在gridview中创建了一个行(标题行),其中包含一个下拉列表和其他输入控件。我也在那一行上放了一个按钮(fltbttn-见下文)。我为名为fltbttn_Click的按钮创建了一个addhandler。我希望使用findcontrol访问我的下拉列表(ddlscantype),但是如何进入存在过滤器控件的标题行?

   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 个答案:

答案 0 :(得分:1)

首先,我跳出来的是你动态创建了你的DropDownList ......但是你已经在一个函数中创建了它。

您必须记住变量/对象具有范围。 DropDownList的范围在您声明的函数内。这意味着它将被添加到页面并进行渲染,但一旦完成,它就会被破坏。当用户回发到服务器时,DropDownList不再存在......因此事件永远不会触发。

您必须为DropDownList提供整个页面的范围。 在页面级别声明它。

使用动态控件时必须注意的另一件事是ASP页面生命周期。

该页面已发布到服务器...

服务器在Page Init Event ....中创建进行服务器计算所需的所有对象。

在页面Init Event之后,为页面加载了ViewState ... ViewState用于确定导致回发的事件。

如果为控件加载ViewState时DropDownList不存在,那么事件将丢失,您的代码将无法处理它。

我建议你尽量避免使用动态控件。 有时您必须使用它们......但它们不易使用。

我写了一篇关于使用dynamic ASP.NET controls的文章,可能有助于您更好地理解。

-Frinny

答案 1 :(得分:1)

为什么不对其中一个数据列使用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>

这应该允许您在标题行内部放置下拉列表,并且不需要创建任何动态控件。

别忘了在这里结束你的活动......