我试图仅在GridView中有多于一行的情况下,才能在GridView上动态显示按钮和复选框。 (该视图是基于搜索用户的结果,因此行数是基于搜索结果的动态)
按钮和复选框的目的是允许我组合2个或更多用户帐户。如果GridView中只有1行(显示混乱),则没有显示该按钮的信息,因此我使用函数设置了“ Visible”参数。但是,在此函数中使用GridViewID.Rows.Count无效。 (我认为这实际上是从调用函数起显示的最大行数)。即:从Gridview的第二行调用给我Row.Count = 2。因此,我尝试通过一个隐藏的控件,但它不起作用。
这是我的代码:
<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:HiddenField ID="HiddenUserID" runat="server" Visible="false" Value= '<%#Eval("UserID") %>' ></asp:HiddenField>
<asp:HiddenField ID="NumberRowsGridView" runat="server" Visible="false" Value='<%#Bind("NumberRowsGridView") %>'></asp:HiddenField>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="UserName" HeaderText="User Name"/>
<asp:BoundField DataField="Email" HeaderText="Email Address"/>
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" Visible='<%# ShowMergeUserButton((String)Eval("UserName"),(String)Eval("Email"),(String)Eval("NumberRowsGridView")) %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="True" HeaderText="Merging Actions">
<ItemTemplate>
<asp:Button ID="Button3" runat="server" CausesValidation="false" CommandName="MergeIntoUser"
Text="Merge Into This Account" CommandArgument='<%# Container.DataItemIndex + "," + Eval("UserID")%>' Visible='<%# ShowMergeUserButton((String)Eval("UserName"),(String)Eval("Email"),(String)Eval("NumberRowsGridView")) %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
功能背后的代码:
protected Boolean ShowMergeUserButton(String Username, String Email, String NumRows)
{
return (Username == Email && Convert.ToInt32(NumRows) > 1);
}
我创建了一个“隐藏”字段,并试图将其插入到GridView中,但是我的代码出现了运行时错误:(注意,我是ASP的新手:)
protected System.Web.UI.WebControls.HiddenField NumberRowsGridView;
-在填充GridView的函数中
-dt是数据源
GridView1.DataSource = dt;
GridView1.DataBind();
NumberRowsGridView.Value = dt.Count<items>().ToString();
我得到的错误是:
System.Web.HttpException:数据绑定:'MyASPPageName + dt'不包含名称为'NumberRowsGridView'的属性。
所以我基本上是完全错误的。
最佳答案
这不会回答您有关如何在标记中执行此操作的问题,但是当事情变得如此复杂时,我喜欢走一条简单的路线。相反,您可以做的是在绑定整个GridView后隐藏/显示按钮。
将DataBound
事件添加到您的GridView中。
<asp:GridView ID="GridView1" runat="server"
OnRowCommand="GridView1_RowCommand"
OnDataBound="GridView1_DataBound">
然后,在这种情况下,所有行都将被绑定。因此,如果您有多行,请显示按钮。如果没有,请隐藏按钮。这应该给您一个想法。
protected void GridView1_DataBound(object sender, EventArgs e)
{
if (GridView1.Rows.Count > 1)
{
foreach (GridViewRow row in GridView1.Rows)
{
Button Button3 = (Button)row.FindControl("Button3");
Button3.Visible = true;
}
}
}
如果您必须在标记中执行此操作,那么Enrique Zavaleta的答案应该可以助您一臂之力。
关于c# - 如何将GridView中的行数作为RowCommand调用的参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30224481/