我在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>
答案 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>
这应该允许您在标题行内部放置下拉列表,并且不需要创建任何动态控件。
别忘了在这里结束你的活动......