使用可折叠/可扩展行创建gridview C#asp.net

时间:2017-07-10 11:19:37

标签: javascript c# asp.net gridview collapse

这是我数据库中的一个表。我想创建一个具有可折叠和可扩展行的Gridview。

 StartDate  EndDate      Section_Name       Section_Value
 2017-06-27 2017-06-28  Section 1 pump1     300
 2017-06-27 2017-06-28  Section 1 pump2     256
 2017-06-27 2017-06-28  Section 1 pump3     11
 2017-06-27 2017-06-28  Section 1 pump4     5252
 2017-06-27 2017-06-28  Section 2 pump1     300
 2017-06-27 2017-06-28  Section 2 pump2     256
 2017-06-27 2017-06-28  Section 2 pump3     212
 2017-06-27 2017-06-28  Section 3 pump1     1222

我希望它如何在gridview中查看:

 (+-) SECTION 1                          TOTAL: 5819
      Section 1 pump1                            300
      Section 1 pump2                            256
      Section 1 pump3                            11
      Section 1 pump4                            5252
 (+-) SECTION 2                          TOTAL: 786
      Section 2 pump1                            300
      Section 2 pump2                            256
      Section 2 pump3                            212 and so on...

如果单击第1部分,它应显示属于第1部分的所有内容,等等。

代码(javascript):

   <script language="javascript" type="text/javascript">

    $(document).ready(function () {
        $('.ExpandCollapseStyle').click(function () {

            var orderId = $(this).attr('alt');

            if (!isDisplayed($('.ExpandCollapse' + orderId))) {
                $(this).attr('src', 'images/minus.gif');
                $('.ExpandCollapse' + orderId).css("display", "block");
            }
            else {
                $(this).attr('src', 'images/plus.gif');
                $('.ExpandCollapse' + orderId).css("display", "none");
            }
        })
        $('.ExpandCollapseGrandStyle').click(function () {

            $(".grdViewOrders tr").each(function () {

                var orderId = $(this).find(".ExpandCollapseStyle").attr('alt');

                if (orderId != 'undefined') {

                    if ($(this).attr('alt') == 'Expanded') {

                        $(this).find(".ExpandCollapseStyle").attr('src', 'images/minus.gif');
                        $('.ExpandCollapse' + orderId).css("display", "block");
                        $(this).attr('alt', 'Collapsed');

                    }
                    else {

                        $(this).find(".ExpandCollapseStyle").attr('src', 'images/plus.gif');
                        $('.ExpandCollapse' + orderId).css("display", "none");
                        $(this).attr('alt', 'Expanded');

                    }
                }
            });
            if ($('.ExpandCollapseGrandStyle').attr('alt') == 'Expanded') {
                $('.ExpandCollapseGrandStyle').attr('src', 'images/plus.gif');
                $('.ExpandCollapseGrandStyle').attr('alt', 'Collapsed');
            }
            else {
                $('.ExpandCollapseGrandStyle').attr('src', 'images/minus.gif');
                $('.ExpandCollapseGrandStyle').attr('alt', 'Expanded');
            }
        })
        function isDisplayed(object) {
            // if the object is visible return true
            if ($(object).css('display') == 'block') {
                return true;
            }
            // if the object is not visible return false
            return false;
        };
    });
</script>

(的GridView)

   <asp:GridView ID="grdViewOrders" BackColor="WhiteSmoke" runat="server" AutoGenerateColumns="False" CssClass="grdViewOrders" 
            GridLines="Vertical" ShowFooter="True" OnRowDataBound="grdViewOrders_RowDataBound"
        onrowcreated="grdViewOrders_RowCreated" >
            <Columns>
               <asp:TemplateField HeaderText="Section Name" >
                <ItemStyle Width="10px" />
                <ItemTemplate>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Section Value">
                <ItemStyle Width="10px" />
                <ItemTemplate>
                </ItemTemplate>
            </asp:TemplateField>

                <asp:BoundField HeaderText="" DataField="Section_Name">
                    <HeaderStyle Width="150px" />
                    <ItemStyle Width="150px" />
                </asp:BoundField>

                 <asp:BoundField HeaderText="" DataField="Section_Value">
                    <HeaderStyle Width="150px" />
                    <ItemStyle Width="150px" />
                </asp:BoundField>


            </Columns>
            <HeaderStyle Height="25px" Font-Bold="True" BackColor="DimGray" ForeColor="White"
                HorizontalAlign="Center" VerticalAlign="Middle" />
            <RowStyle Height="25px" BackColor="Gainsboro" HorizontalAlign="Center" VerticalAlign="Middle" />
            <AlternatingRowStyle Height="25px" BackColor="LightGray" HorizontalAlign="Center"
                VerticalAlign="Middle" />
            <FooterStyle BackColor="Gray" />
        </asp:GridView>

(C#背后的代码)

public partial class Default3 : System.Web.UI.Page
   {
       // To keep track of the previous row Group Identifier
string strPreviousRowID = string.Empty;
// To keep track the Index of Group Total
int intSectionTotalIndex = 1;
string strGroupHeaderText = string.Empty;   
double dblSectionTotal = 0;



protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Method();
    }
}

protected void Method()
{
   connection made to sql db and bind data to gv
}


protected void grdViewOrders_RowCreated(object sender, GridViewRowEventArgs e)
{
    bool IsSectionTotalRowNeedtoAdd = false;

    if ((strPreviousRowID != string.Empty) && (DataBinder.Eval(e.Row.DataItem, "Section_Name") == null))
    {                    
        IsSectionTotalRowNeedtoAdd = true;
        intSectionTotalIndex = 0;
    }



if (IsSectionTotalRowNeedtoAdd)
{
    #region SectionTotal
    GridView grdViewOrders = (GridView)sender;

    // Creating a Row
    GridViewRow row = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Insert);

    //Adding Group Expand Collapse Cell 
    TableCell cell = new TableCell();
    System.Web.UI.HtmlControls.HtmlImage img = new System.Web.UI.HtmlControls.HtmlImage();
    img.Src = "images/minus.gif";
    img.Attributes.Add("class", "ExpandCollapseGrandStyle");
    img.Attributes.Add("alt", "Expanded");
    cell.Controls.Add(img);
    cell.HorizontalAlign = HorizontalAlign.Left;
   row.Cells.Add(cell);

    //Adding Expand Collapse Cell 
    cell = new TableCell();
    row.Cells.Add(cell);

    //Adding Header Cell 
    cell = new TableCell();
    cell.Text = "Section 1 Total";
    cell.HorizontalAlign = HorizontalAlign.Left;
    cell.ColumnSpan = 1;
    row.Cells.Add(cell);

    //Adding Amount Column
    cell = new TableCell();
   cell.HorizontalAlign = HorizontalAlign.Right;
    row.Cells.Add(cell);

    //Adding the Row at the RowIndex position in the Grid
    grdViewOrders.Controls[0].Controls.AddAt(e.Row.RowIndex, row);
    #endregion
}

}

protected void grdViewOrders_RowDataBound(object sender, GridViewRowEventArgs e)
{               if (e.Row.RowType == DataControlRowType.DataRow)
    {
        strPreviousRowID = DataBinder.Eval(e.Row.DataItem, "Section_Name").ToString();
        double dblSAmount = Convert.ToDouble(DataBinder.Eval(e.Row.DataItem, "Section_Value").ToString());
                dblSectionTotal += dblSAmount;
        e.Row.Style.Add("display", "block");
        e.Row.CssClass = "ExpandCollapse" + strPreviousRowID;
    }
}

如果有更简单的方法,请留下链接或一些提示。谢谢。

为了进一步参考,我试图利用来源: http://www.dotnettwitter.com/2012/07/group-total-and-grand-total-in-gridview_15.html

1 个答案:

答案 0 :(得分:0)

试试这个例子:

ASPX代码:

<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" CssClass="Grid"
DataKeyNames="CustomerID" OnRowDataBound="OnRowDataBound">
<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <img alt = "" style="cursor: pointer" src="images/plus.png" />
            <asp:Panel ID="pnlOrders" runat="server" Style="display: none">
                <asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false" CssClass = "ChildGrid">
                    <Columns>
                        <asp:BoundField ItemStyle-Width="150px" DataField="OrderId" HeaderText="Order Id" />
                        <asp:BoundField ItemStyle-Width="150px" DataField="OrderDate" HeaderText="Date" />
                    </Columns>
                </asp:GridView>
            </asp:Panel>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField ItemStyle-Width="150px" DataField="ContactName" HeaderText="Contact Name" />
    <asp:BoundField ItemStyle-Width="150px" DataField="City" HeaderText="City" />
</Columns>

.CS代码

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
    gvCustomers.DataSource = GetData("select top 10 * from Customers");
    gvCustomers.DataBind();
}
}

private static DataTable GetData(string query)
{
string strConnString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(strConnString))
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.CommandText = query;
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataSet ds = new DataSet())
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
}

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
    string customerId = gvCustomers.DataKeys[e.Row.RowIndex].Value.ToString();
    GridView gvOrders = e.Row.FindControl("gvOrders") as GridView;
    gvOrders.DataSource = GetData(string.Format("select top 3 * from Orders where CustomerId='{0}'", customerId));
    gvOrders.DataBind();
}
}

客户端使用jQuery和JavaScript展开折叠功能

对于子GridViews的展开和折叠我已经使用了jQuery

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$("[src*=plus]").live("click", function () {
    $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>")
    $(this).attr("src", "images/minus.png");
});
$("[src*=minus]").live("click", function () {
    $(this).attr("src", "images/plus.png");
    $(this).closest("tr").next().remove();
});

链接1:https://www.aspsnippets.com/Articles/Nested-GridView-Example-in-ASPNet-using-C-and-VBNet.aspx

链接2:http://www.c-sharpcorner.com/UploadFile/b926a6/nested-grid-view-in-Asp-Net/