我有一个gridview,显示数据表中的条目。我通过在网格视图标题中添加文本框和搜索按钮,让用户能够选择表中数据的子集。搜索按钮触发gridview row命令,并更改底层sqlDataSource的select命令,并将文本框中的文本值作为参数添加。
这很顺利。
此外,我在标题中有一个“全部显示”按钮,清除了选择参数,因此显示了表格中的所有条目。再次,这完美地运作。
什么是无效的是控制“全部显示”按钮控件的可见性。下面是数据网格标题模板的html标记:
<HeaderTemplate>
<asp:Button ID="btnShowAll" runat="server" CausesValidation="False" CommandName="ShowAll" Text="Show All" />
<asp:Button ID="btnSearch" runat="server" CausesValidation="True" CommandName="Search" Text="Search" ValidationGroup="vldSearch" /><br />
<asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="vldSearchName" runat="server" ErrorMessage="You have to provide an attorney name to search for." Text="*" ControlToValidate="txtSearchName" ValidationGroup="vldSearch" ForeColor="White"></asp:RequiredFieldValidator>
</HeaderTemplate>
在Row Command事件处理程序中,以下是我设置按钮可见性的方法:
If Not Me.dgAttorneys.HeaderRow Is Nothing Then
Dim btnShowAll As Button = Me.dgAttorneys.HeaderRow.FindControl("btnShowAll")
btnShowAll.Visible = Me.sqlAttorneys.SelectParameters.Count > 0
Trace.Write("Show all status is " & btnShowAll.Visible.ToString)
End If
trace语句显示正确的可见状态 - 如果单击“show all”按钮,我在sqlAttorneys sqlDataSource上执行SelectParameters.Clear()。
我的问题是由于对“FindControl”方法如何工作的误解 - 我假设我定义的新btnShowAll实际上是对aspx页面上的“物理”控件的引用,所以我对我做的任何更改本地对象反映在页面上的控件中。
如果不是这种情况,在网格视图的标题行中获取对按钮控件的引用的最佳方法是什么?
答案 0 :(得分:0)
我设法让按钮行为起作用 - 这与我在设置按钮可见性的整个过程中的位置有关。我移动了代码块(根据搜索参数的存在设置按钮可见性)到数据网格的DataBound事件,按钮的可见性设置为应该的。
我怀疑这是因为在整个数据绑定过程中,基于整个网格视图和每个网格行的状态,使用适当的模板对象来呈现每一行。因此,在数据绑定过程中,将覆盖对按钮的可见属性所做的任何更改。通过移动我的代码来设置可见性直到数据绑定完成之后,它才生效。