当DropDownList筛选器的值不是ALL时,如何删除GridView中的整个第一列

本文关键字:GridView 删除 一列 何删除 筛选 DropDownList ALL | 更新日期: 2023-09-27 18:20:19

我有以下复杂的asp.net代码结构:

  1. 下拉列表作为筛选器
  2. 中继器
  3. 在中继器内部:我有HiddenField和GridView

我希望当Filter的值设置为All时,第一列应该被删除。问题是我使用的StoredProcedure负责生成三个GridView,这样我就把GridView放在了Repeater中。

ASP.NET代码:

<asp:DropDownList ID="ddlDivision" runat="server" AppendDataBoundItems="True" 
        AutoPostBack="True" DataSourceID="sqlDataSourceDivision" DataTextField="DivisionName" 
        DataValueField="DivisionName"  
        Width="275px" EnableViewState="False">
        <asp:ListItem Value="%">All</asp:ListItem>
    </asp:DropDownList>

     <br />  <br />  
        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
            <ItemTemplate>
                <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("GroupID")%>' />
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                                    ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
                                    SelectCommandType="StoredProcedure" SelectCommand="kbiReport"
                                    FilterExpression="[DivisionName] like '{0}%'">
                    <FilterParameters>
                        <asp:ControlParameter ControlID="ddlDivision" Name="DivisionName" 
                                                 PropertyName="SelectedValue" Type="String" />
                    </FilterParameters>
                    <SelectParameters>
                        <%--ControlParameter is linked to the HiddenField above to generate different GridView based on different values 
                            of GroupID--%>
                        <asp:ControlParameter ControlID="HiddenField1" Name="GroupID" PropertyName="Value" />
                    </SelectParameters>
                </asp:SqlDataSource>
                <div style="width:700px; overflow:auto; overflow-y:hidden;">
                <asp:GridView ID="GridView1" runat="server" 
                                AllowSorting="True" 
                                CellPadding="3" 
                                DataSourceID="SqlDataSource1" 
                                ClientIDMode="Static" class="fixedTables" Width="600" AutoGenerateColumns="true"
                                AlternatingRowStyle-CssClass="alt"
                                RowStyle-HorizontalAlign="Center" 
                                OnRowDataBound="GridView1_RowDataBound" OnPreRender="GridView1_PreRender" OnRowCreated="GridView1_RowCreated"
                                OnDataBound="GridView1_DataBound">
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                    <HeaderStyle Font-Bold = "true" ForeColor="Black"/> 
                    <Columns>
                    </Columns>
                    <EditRowStyle BackColor="#999999" />
                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                </asp:GridView>
                </div>
                <br />
            </ItemTemplate>
        </asp:Repeater>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                           ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
                           SelectCommand="SELECT DISTINCT GroupID FROM courses">
        </asp:SqlDataSource>
        <%--Filtering by Division--%>
        <asp:SqlDataSource ID="sqlDataSourceDivision" runat="server" 
        ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
        SelectCommand="SELECT [DivisionName] FROM [Divisions]"></asp:SqlDataSource>

背后的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        //Repeater1.DataBind();

    }

    //protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    //{
    //    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    //    {
    //        GridView gv = e.Item.FindControl("GridView1") as GridView;
    //        if (gv != null)
    //        {
    //            gv.DataBind();
    //            if (ddlDivision.SelectedValue != "ALL")
    //            {
    //                if (gv.Columns.Count > 0)
    //                    gv.Columns[0].Visible = false;
    //                else
    //                {
    //                    gv.HeaderRow.Cells[0].Visible = false;
    //                    foreach (GridViewRow gvr in gv.Rows)
    //                    {
    //                        gvr.Cells[0].Visible = false;
    //                    }
    //                }
    //            }
    //        }
    //    }
    //}

    //protected void ddlDivision_SelectedIndexChanged(object sender, EventArgs e)
    //{
    //    if (ddlDivision.SelectedItem.Text == "All")
    //    {
    //        GridView1.Columns[0].Visible = true;
    //    }
    //    else
    //    {
    //        GridView1.Columns[0].Visible = false;
    //    }
    //}
    //This method is for deleting the first column in the GridView
    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
       // e.Row.Cells[0].Visible = false; // hides the first column
    }
    protected void GridView1_DataBound(object sender, EventArgs e)
    {
        //GridView GridView1 = (GridView)sender;
        //foreach (GridViewRow gvr in GridView1.Rows)
        //{
        //    if (ddlDivision.SelectedValue != "All")
        //    {
        //        gvr.Cells[0].Visible = false;
        //    }
        //}


    }

    //This function is for checking each cell in each row. 
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //var gv = sender as GridView;
        //if (ddlDivision.SelectedValue == "All")
        //    gv.Columns[0].Visible = false;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            foreach (TableCell c in e.Row.Cells)
            {
                // Check if the cell vlaue = Yes
                // if it is Yes, the cell will be colored with Light Green 
                if (c.Text.Contains(", Yes"))
                {
                    c.BackColor = System.Drawing.Color.LightGreen;
                    c.Text = "&bull;";
                }
                else if (c.Text.Contains(", NO"))
                {
                    c.Text = "";
                }
            }
        }
         //The following is for changing the color of headers in each GridView based on the value of the HiddenFild 
         //BTW, the value of the HiddenField is the value of the GroupID in Group Table in the Database 
        else if (e.Row.RowType == DataControlRowType.Header)
        {
            switch (((HiddenField)((GridView)sender).Parent.FindControl("HiddenField1")).Value)
            {
                case "1":
                    for (int i = 4; i < e.Row.Cells.Count; i++)
                        e.Row.Cells[i].BackColor = System.Drawing.Color.LightBlue;
                    break;
                case "2":
                    for (int i = 4; i < e.Row.Cells.Count; i++)
                        e.Row.Cells[i].BackColor = System.Drawing.Color.LightYellow;
                    break;
                case "3":
                    for (int i = 4; i < e.Row.Cells.Count; i++)
                        e.Row.Cells[i].BackColor = System.Drawing.Color.Orange;
                    break;
            }
        }
    }

    protected void GridView1_PreRender(object sender, EventArgs e)
    {
        var gv = sender as GridView;
        if (gv.Rows.Count > 0)
        {
            gv.UseAccessibleHeader = true;
            gv.HeaderRow.TableSection = TableRowSection.TableHeader;
        }
    }

我做了很多尝试,但都失败了,正如你在上面的代码后面看到的那样。最后一次尝试是:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        GridView gv = e.Item.FindControl("GridView1") as GridView;
        if (gv != null)
        {
            gv.DataBind();
            if (ddlDivision.SelectedValue != "ALL")
            {
                if (gv.Columns.Count > 0)
                    gv.Columns[0].Visible = false;
                else
                {
                    gv.HeaderRow.Cells[0].Visible = false;
                    foreach (GridViewRow gvr in gv.Rows)
                    {
                        gvr.Cells[0].Visible = false;
                    }
                }
            }
        }
    }
}

我失败了有人能帮我解决这个问题吗

当DropDownList筛选器的值不是ALL时,如何删除GridView中的整个第一列

我希望当Filter的值设置为All时,第一列应移除。

如果是这样的话,你肯定想要这个:

if (ddlDivision.SelectedValue == "ALL") { // hide column 0 } 

而不是这个:

if (ddlDivision.SelectedValue != "ALL") { // hide column 0 } 

假设对gv对象有正确的引用,并且GridView的AutoGenerateColumns属性设置为false,则使用gv.Columns[0].Visible = false;应该可以正常工作。

您必须确保这一点,因为AutoGenerateColumns="true"是GridView的默认值,在这种情况下,GridView.Columns.Count将始终为0。如果您尝试引用.Columns[x],它将抛出一个"索引超出范围"例外

更多信息请点击此处:https://stackoverflow.com/a/3819831/441574

更新:

当您使用AutoGenerateColumns="true"时,您可以使用GridView:的RowDataBound事件来隐藏列

创建事件处理程序:

如果您的GridView是静态(在.aspx页面上声明),请将其添加到声明中:OnRowDataBound="gv_RowDataBound"

如果您的GridView是用程序创建的,请添加RowDataBound事件处理程序:gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);

然后添加您的RowDataBound事件:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    ...
    if (e.Row.RowType != DataControlRowType.Pager) 
    {
        if (ddlDivision.SelectedItem.Text != "ALL")
        {
           // only check for pager row, all other rows including header/footer should be hidden
           e.Row.Cells[0].Visible = false; 
        }
    }
    ...    
}