我试图仅在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/

10-17 00:51