間違いなくjQueryを使用して、折りたたみ可能なDIVを使用して、(SQLデータベースに保存された)月ごとにいくつかのデータをグループ化したいと考えています。jQuery を作成するときに簡単にするためにテーブルから離れたいので、特に GridView を使用したくありません。
ASP.NET でこれを行うには、どのコントロールを使用すればよいですか?
私が説明しようとしていることのアイデアについては、次の例を参照してください。
間違いなくjQueryを使用して、折りたたみ可能なDIVを使用して、(SQLデータベースに保存された)月ごとにいくつかのデータをグループ化したいと考えています。jQuery を作成するときに簡単にするためにテーブルから離れたいので、特に GridView を使用したくありません。
ASP.NET でこれを行うには、どのコントロールを使用すればよいですか?
私が説明しようとしていることのアイデアについては、次の例を参照してください。
ネストされたリピーターを使用して月ごとにデータを表示するプロジェクトを作成しました。これはGoogle Docsにアップロードされています([ファイル] -> [保存] をクリックして .zip をダウンロードするだけです)。
これがどのように機能するかの簡単な概要は次のとおりです。
データベースに次の列を持つ単純な Orders テーブルがあると仮定します
OnItemDataBound
マスター リピーターのイベントを処理します。このイベントは、アイテムがリピーターにバインドされるたびに実行されます。OnItemDataBound
でストアドプロシージャを実行して、特定の月と年のすべてのレコードを取得し、返されたデータを子リピーターにバインドするだけですストアド プロシージャ:
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: <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();
}
}
}
}
}
結果: