首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FindControl问题

FindControl问题
EN

Stack Overflow用户
提问于 2009-08-10 13:46:57
回答 2查看 808关注 0票数 0

我在网格视图中创建了一行(标题行),在其他输入控件中有一个下拉列表。我还在该行上放置了一个按钮(fltbttn-见下文)。我为按钮创建了一个名为fltbttn_Click的加载项处理程序。我希望使用findcontrol访问我的下拉列表(ddlscantype),但是如何才能到达存在筛选器控件的标题行?

代码语言:javascript
复制
   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)

标记

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2009-08-10 13:56:56

首先我要说的是,您已经动态地创建了您的DropDownList...but,您已经在一个函数中创建了它。

您必须记住,变量/对象有作用域。DropDownList的作用域在声明它的函数中。这意味着它将被添加到页面中并呈现出来,但是一旦完成,它就被销毁了。当用户导致回发到服务器时,DropDownList不再是exists...and,因此事件不会触发。

您必须给DropDownList一个整个页面的范围。在页面级别声明它。

在使用动态控件时,必须记住的另一件事是ASP页面生命周期。

页面被上传到服务器..。

服务器在Page Init事件中创建执行服务器计算所需的所有对象.

就在页面Init事件之后,为page...the加载了page...the ViewState,以确定哪些事件导致回发发生。

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

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

我写了一篇关于使用动态ASP.NET控件的文章,这可能有助于您更好地理解。

-Frinny

票数 1
EN

Stack Overflow用户

发布于 2009-08-10 16:14:21

为什么您不使用TemplateField类型作为您的一个数据,然后使用模板标题?

例如:

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1254996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档