4

我希望按月对一些数据进行分组(存储在 SQL 数据库中),使用可折叠的 DIV,毫无疑问使用 jQuery。我不是特别想使用 GridView,因为在编写 jQuery 时为了简单起见,我想远离表格。

在 ASP.NET 中执行此操作的最佳方法是什么,我将使用哪个控件?

请参阅以下示例,了解我要描述的内容:

分组示例

4

1 回答 1

2

我创建了一个使用嵌套中继器按月显示数据的项目,它已上传到Google Docs(只需单击文件->保存即可下载 .zip)。

以下是其工作原理的简要概述:

假设您在数据库中有一个简单的 Orders 表,其中包含以下列

  1. 订单编号
  2. 产品
  3. 数量
  4. 销售日期

过程

  1. 执行存储过程以获取给定年份的月份(我使用了 EntityFramework 函数,您可以将其更改为 ADO.NET、LINQ 等)
  2. 将返回的月份绑定到主中继器中的标签(这些将是您的标题)
  3. 处理OnItemDataBound主转发器的事件,每次将项目绑定到转发器时都会运行此事件
  4. 在里面OnItemDataBound执行一个存储过程来获取特定月份和年份的所有记录,并将返回的数据简单地绑定到子转发器
  5. 添加小 jQuery 来显示和隐藏 div 就可以了。

代码

存储过程:

CREATE PROCEDURE dbo.GetMonthsByYear
@Year INT 
AS
BEGIN
    SELECT DISTINCT DATENAME(Month,DateOfSale) AS [Month] FROM Orders
    WHERE Year(DateOfSale) = @Year
END

CREATE PROCEDURE dbo.GetOrdersByMonth
@Month NVARCHAR(15),
@Year INT 
AS
BEGIN
    SELECT * FROM Orders
    WHERE (Year(DateOfSale) = @Year) AND DATENAME(MONTH,DateOfSale) = @Month
END

ASPX:

<head runat="server">
    <script src="Scripts/jquery-1.7.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        var showHide;
        $(document).ready(function () {
            showHide = function (control) {
                var parent = $(control).next();
                var display = parent.css('display');
                if (display == "none") { parent.fadeIn('slow'); }
                else { parent.fadeOut('slow'); }

            };
        });
    </script>
    <style type="text/css">
        .detail
        {
            height:300px;
            display:none;
            width: 100%;
            border: 1px solid black;
        }

        .header
        {
            vertical-align: top;
            padding: 3px;
            height: 30px;
            background: black;
            color: White;
            font-weight: bold;
        }
    </style>
    <title>Nested Repeater</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Select year:&nbsp;<asp:TextBox ID="txtYear" runat="server" /><br />
        <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="Search" /><br />
        <asp:Repeater ID="masterRepeater" runat="server" OnItemDataBound="ItemDataBound">
            <ItemTemplate>
                <div id='<%# Container.DataItem  %>' class="header" onclick="showHide(this);">
                    <asp:Label ID="lblMonth" runat="server" Text='<%# Container.DataItem %>' />
                </div>
                <div class="detail">
                    <asp:Repeater ID="detailRepeater" runat="server">
                        <HeaderTemplate>
                            <span style="text-decoration: underline">Product</span><br />
                        </HeaderTemplate>
                        <ItemTemplate>
                            <asp:Label ID="lblName" runat="server" Text='<%# Bind("Product") %>' />
                            <asp:Label ID="lblQuantity" runat="server" Text='<%# Bind("Quantity") %>' />
                            <asp:Label ID="lblDateOfSale" runat="server" Text='<%# Bind("DateOfSale") %>' /><br />
                        </ItemTemplate>
                    </asp:Repeater>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>

后面的代码:

protected void Search(object sender, EventArgs e)
{
    int year = 0;
    if (Int32.TryParse(txtYear.Text, out year))
    {
        orderEntities orders = new orderEntities();
        List<string> months = orders.GetMonthByYear(year).ToList();
        masterRepeater.DataSource = months;
        masterRepeater.DataBind();
    }
}

protected void ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        int year = 0;
        if (Int32.TryParse(txtYear.Text, out year))
        {
            Label lblMonth = e.Item.FindControl("lblMonth") as Label;
            if (lblMonth != null)
            {
                string month = lblMonth.Text;
                Repeater detailRepeater = e.Item.FindControl("detailRepeater") as Repeater;
                if (detailRepeater != null)
                {
                    orderEntities orders = new orderEntities();
                    var ordersByMonth = orders.GetOrdersByMonth(month, year).ToList();
                    detailRepeater.DataSource = ordersByMonth;
                    detailRepeater.DataBind();
                }
            }
        }
    }
}

结果:

在此处输入图像描述

于 2013-01-26T17:52:40.100 回答