asp:repeater 折叠 table 行 - 已更新
asp:repeater collapsing table rows - Updated
我想知道是否有人对我的问题有创造性的解决方案。我有一个从我的数据库中填充的转发器,如下所示:
<asp:Repeater ID="ResultsTableRepeater" runat="server" OnPreRender="ResultsTableRepeater_PreRender">
<HeaderTemplate>
<table class="td-table-bordered" style="font-size: small; width: 90%">
<tr>
<th>Change #</th>
<th>Change Title</th>
<th>Change Description</th>
<th>Clarity Id</th>
<th>Package Description</th>
<th>Package Name</th>
<th>Package Status</th>
<th>Assigned To</th>
<th>New Package</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<asp:Literal runat="server" Text='<%# Eval("ChangeId") %>' ID="IdTag" Visible="false"></asp:Label>
<tr id="tableRow" class="" data-changeId='<%# Eval("ChangeId") %>' runat="server" style='<%#(Eval("AssignedTo").ToString() == "7" || Eval("AssignedTo").ToString() == "8")? "": "font-weight:bold; background-color:cornsilk" %>'>
<td><%# Eval("ChangeId") %></td>
<td><%# Eval("ChangeTitle") %></td>
<td><%# Eval("ChangeDescription") %></td>
<td><%# Eval("ClarityId") %></td>
<td><%# (Eval("PackageId").ToString() == string.Empty) ? ""
: "<a href=http://dev.rlaninfrastructure.tdbank.ca/RCIViewForm?ChangeId=" + Eval("ChangeId") + "&PackageId=" + Eval("PackageId") + " runat='server' id='RCILink'>" %>
<asp:Label ID="ExistingPackageLabel" runat="server" Text='<%# (Eval("PackageId").ToString() == string.Empty) ? "No packages" : Eval("PackageDescription").ToString() %>'>
</asp:Label><%# (Eval("PackageId").ToString() == string.Empty) ? "" : "</a>" %>
</td>
<td><%# Eval("PackageName") %></td>
<td>
<asp:Label ID="LabRequestedLabel" runat="server" Text='<%# (Eval("PackageStatus").ToString() == "1") ? "Requested"
: (Eval("PackageStatus").ToString() == "2") ? "Built"
: (Eval("PackageStatus").ToString() == "3") ? "NFT"
: (Eval("PackageStatus").ToString() == "4") ? "Pilot"
: (Eval("PackageStatus").ToString() == "5") ? "Production"
: (Eval("PackageStatus").ToString() == "6") ? "Completed"
: (Eval("PackageStatus").ToString() == "7") ? "Cancelled"
: (Eval("PackageStatus").ToString() == "8") ? "Pending"
: "" %>'></asp:Label>
</td>
<td><%# (Eval("EmployeeName").ToString() == string.Empty) ? "" : Eval("EmployeeName")%></td>
<td><%# "<a href=http://dev.rlaninfrastructure.tdbank.ca/RCIViewForm?ChangeId=" + Eval("ChangeId") + " runat='server' id='RCILink'>"%>
<asp:Label ID="NewPackageLabel" runat="server" Text="Create New">
</asp:Label><%#"</a>" %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
它会生成一个看起来像这样的 table
我圈出的是具有重复更改 ID 的行,我想默认折叠这些行,但可以单击以展开(以及再次单击以再次折叠)。
我已经开始实施下面 Jon P 的解决方案,我快完成了!只是 Jquery onclick 事件。
下面是我的代码隐藏 PreRender 方法。
protected void ResultsTableRepeater_PreRender(object sender, EventArgs e) {
int previousId = 0;
int currentId = 0;
int nextId = 0;
for (int item = 0; item < ResultsTableRepeater.Items.Count; item++) {
Literal idTag = (Literal)ResultsTableRepeater.Items[item].FindControl("IdTag");
Literal classTag = (Literal)ResultsTableRepeater.Items[item].FindControl("ClassTag");
HtmlTableRow tableRow = (HtmlTableRow)ResultsTableRepeater.Items[item].FindControl("tableRow");
if (item != ResultsTableRepeater.Items.Count - 1)
int.TryParse(((Literal)ResultsTableRepeater.Items[item + 1].FindControl("IdTag")).Text.ToString(), out nextId);
if (int.TryParse(idTag.Text, out currentId)) {
if (currentId == previousId) {
tableRow.Attributes["class"] = "hidden";
}
else if (currentId != previousId && currentId == nextId) {
tableRow.Attributes["class"] = "toggler";
}
}
else
nextId = 0;
int.TryParse(idTag.Text, out previousId);
}
}
再次更新:我唯一需要修复的是 jquery,它展开和折叠切换器行上的 hidden/opened 行。根据 Jon P 的帮助,下面是 jquery 和 css。
$(".toggler").click(function(){
var idClicked = $(this).data("changeid");
//Toggle hidden on the sibling rows with the same data id
$(this).nextAll("[data-changeId='" + idClicked +"']").toggleClass("hidden");
//Toggle opened status on clicked row
$(this).toggleClass("opened");
});
.hidden{display:none;}
.toggler td:first-child::after{content:" +";}
.toggler.opened td:first-child::after{content:" -";}
有人可以在这最后阶段帮助我吗?我觉得我很接近。
Select Distinct from yourtableName
在您的查询中使用 distinct 这可能是因为您的查询可能是或者您正在使用左连接和一些 table 如果您正在使用连接然后进行内部连接
中继器将重复提供的任何源
所以你的查询有问题(数据源)
没有时间给出完整的答案,因为涉及服务器端的问题相当多,所以我会尽量给您一个大致的了解。
您需要考虑将 class 添加到您的 table 行,也许将 asp:literal
添加到您的 tr
以保留 class。还要为您的 ID 添加一个 asp:literal
,这将为您提供一个控件,您可以从中获取值。也许将该文字用于 table 行上的数据属性。
然后在 Repeater 上使用 OnPreRender
事件。这里迭代中继器的项目。将您存储在我上面提到的文字中的 id 与上一项和下一项中的 id 进行比较。如果id和之前的id一样,加一个css class可以用来隐藏。如果id与上一个不同,下一个相同,则加一个css class表示该行用于隐藏和折叠。
添加一些 CSS 以隐藏使用上面添加的 class 的行。
您想以类似于以下内容的 HTML 结束。我还使用 jquery
添加了展开和折叠
$(document).ready(function() {
$(".toggler").click(function() {
var idClicked = $(this).data("changeid");
//Toggle hidden on the sibling rows with the same data id
$(this).nextAll("[data-changeId='" + idClicked + "']").toggleClass("hidden");
//Toggle opened status on clicked row
$(this).toggleClass("opened");
});
});
.hidden {
display: none;
}
.toggler td:first-child::after {
content: " +";
}
.toggler.opened td:first-child::after {
content: " -";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table class="td-table-bordered" style="font-size: small; width:90%">
<tr>
<th>Change #</th>
<th>Change Title</th>
<th>Change Description</th>
<th>Clarity Id</th>
<th>Package Description</th>
<th>Package Name</th>
<th>Package Status</th>
<th>Assigned To</th>
<th>New Package</th>
</tr>
<tr data-changeId="1">
<td>1</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="toggler" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr data-changeId="3">
<td>3</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="toggler" data-changeId="4">
<td>4</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="4">
<td>4</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
</table>
注意 这一切都可以在客户端完成,但是当 table 完全展开时 javascript 会计算出什么隐藏。这对您的用户来说可能是一种不和谐的体验。
我想知道是否有人对我的问题有创造性的解决方案。我有一个从我的数据库中填充的转发器,如下所示:
<asp:Repeater ID="ResultsTableRepeater" runat="server" OnPreRender="ResultsTableRepeater_PreRender">
<HeaderTemplate>
<table class="td-table-bordered" style="font-size: small; width: 90%">
<tr>
<th>Change #</th>
<th>Change Title</th>
<th>Change Description</th>
<th>Clarity Id</th>
<th>Package Description</th>
<th>Package Name</th>
<th>Package Status</th>
<th>Assigned To</th>
<th>New Package</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<asp:Literal runat="server" Text='<%# Eval("ChangeId") %>' ID="IdTag" Visible="false"></asp:Label>
<tr id="tableRow" class="" data-changeId='<%# Eval("ChangeId") %>' runat="server" style='<%#(Eval("AssignedTo").ToString() == "7" || Eval("AssignedTo").ToString() == "8")? "": "font-weight:bold; background-color:cornsilk" %>'>
<td><%# Eval("ChangeId") %></td>
<td><%# Eval("ChangeTitle") %></td>
<td><%# Eval("ChangeDescription") %></td>
<td><%# Eval("ClarityId") %></td>
<td><%# (Eval("PackageId").ToString() == string.Empty) ? ""
: "<a href=http://dev.rlaninfrastructure.tdbank.ca/RCIViewForm?ChangeId=" + Eval("ChangeId") + "&PackageId=" + Eval("PackageId") + " runat='server' id='RCILink'>" %>
<asp:Label ID="ExistingPackageLabel" runat="server" Text='<%# (Eval("PackageId").ToString() == string.Empty) ? "No packages" : Eval("PackageDescription").ToString() %>'>
</asp:Label><%# (Eval("PackageId").ToString() == string.Empty) ? "" : "</a>" %>
</td>
<td><%# Eval("PackageName") %></td>
<td>
<asp:Label ID="LabRequestedLabel" runat="server" Text='<%# (Eval("PackageStatus").ToString() == "1") ? "Requested"
: (Eval("PackageStatus").ToString() == "2") ? "Built"
: (Eval("PackageStatus").ToString() == "3") ? "NFT"
: (Eval("PackageStatus").ToString() == "4") ? "Pilot"
: (Eval("PackageStatus").ToString() == "5") ? "Production"
: (Eval("PackageStatus").ToString() == "6") ? "Completed"
: (Eval("PackageStatus").ToString() == "7") ? "Cancelled"
: (Eval("PackageStatus").ToString() == "8") ? "Pending"
: "" %>'></asp:Label>
</td>
<td><%# (Eval("EmployeeName").ToString() == string.Empty) ? "" : Eval("EmployeeName")%></td>
<td><%# "<a href=http://dev.rlaninfrastructure.tdbank.ca/RCIViewForm?ChangeId=" + Eval("ChangeId") + " runat='server' id='RCILink'>"%>
<asp:Label ID="NewPackageLabel" runat="server" Text="Create New">
</asp:Label><%#"</a>" %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
它会生成一个看起来像这样的 table
我圈出的是具有重复更改 ID 的行,我想默认折叠这些行,但可以单击以展开(以及再次单击以再次折叠)。
我已经开始实施下面 Jon P 的解决方案,我快完成了!只是 Jquery onclick 事件。
下面是我的代码隐藏 PreRender 方法。
protected void ResultsTableRepeater_PreRender(object sender, EventArgs e) {
int previousId = 0;
int currentId = 0;
int nextId = 0;
for (int item = 0; item < ResultsTableRepeater.Items.Count; item++) {
Literal idTag = (Literal)ResultsTableRepeater.Items[item].FindControl("IdTag");
Literal classTag = (Literal)ResultsTableRepeater.Items[item].FindControl("ClassTag");
HtmlTableRow tableRow = (HtmlTableRow)ResultsTableRepeater.Items[item].FindControl("tableRow");
if (item != ResultsTableRepeater.Items.Count - 1)
int.TryParse(((Literal)ResultsTableRepeater.Items[item + 1].FindControl("IdTag")).Text.ToString(), out nextId);
if (int.TryParse(idTag.Text, out currentId)) {
if (currentId == previousId) {
tableRow.Attributes["class"] = "hidden";
}
else if (currentId != previousId && currentId == nextId) {
tableRow.Attributes["class"] = "toggler";
}
}
else
nextId = 0;
int.TryParse(idTag.Text, out previousId);
}
}
再次更新:我唯一需要修复的是 jquery,它展开和折叠切换器行上的 hidden/opened 行。根据 Jon P 的帮助,下面是 jquery 和 css。
$(".toggler").click(function(){
var idClicked = $(this).data("changeid");
//Toggle hidden on the sibling rows with the same data id
$(this).nextAll("[data-changeId='" + idClicked +"']").toggleClass("hidden");
//Toggle opened status on clicked row
$(this).toggleClass("opened");
});
.hidden{display:none;}
.toggler td:first-child::after{content:" +";}
.toggler.opened td:first-child::after{content:" -";}
有人可以在这最后阶段帮助我吗?我觉得我很接近。
Select Distinct from yourtableName
在您的查询中使用 distinct 这可能是因为您的查询可能是或者您正在使用左连接和一些 table 如果您正在使用连接然后进行内部连接 中继器将重复提供的任何源 所以你的查询有问题(数据源)
没有时间给出完整的答案,因为涉及服务器端的问题相当多,所以我会尽量给您一个大致的了解。
您需要考虑将 class 添加到您的 table 行,也许将 asp:literal
添加到您的 tr
以保留 class。还要为您的 ID 添加一个 asp:literal
,这将为您提供一个控件,您可以从中获取值。也许将该文字用于 table 行上的数据属性。
然后在 Repeater 上使用 OnPreRender
事件。这里迭代中继器的项目。将您存储在我上面提到的文字中的 id 与上一项和下一项中的 id 进行比较。如果id和之前的id一样,加一个css class可以用来隐藏。如果id与上一个不同,下一个相同,则加一个css class表示该行用于隐藏和折叠。
添加一些 CSS 以隐藏使用上面添加的 class 的行。
您想以类似于以下内容的 HTML 结束。我还使用 jquery
添加了展开和折叠$(document).ready(function() {
$(".toggler").click(function() {
var idClicked = $(this).data("changeid");
//Toggle hidden on the sibling rows with the same data id
$(this).nextAll("[data-changeId='" + idClicked + "']").toggleClass("hidden");
//Toggle opened status on clicked row
$(this).toggleClass("opened");
});
});
.hidden {
display: none;
}
.toggler td:first-child::after {
content: " +";
}
.toggler.opened td:first-child::after {
content: " -";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table class="td-table-bordered" style="font-size: small; width:90%">
<tr>
<th>Change #</th>
<th>Change Title</th>
<th>Change Description</th>
<th>Clarity Id</th>
<th>Package Description</th>
<th>Package Name</th>
<th>Package Status</th>
<th>Assigned To</th>
<th>New Package</th>
</tr>
<tr data-changeId="1">
<td>1</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="toggler" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="2">
<td>2</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr data-changeId="3">
<td>3</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="toggler" data-changeId="4">
<td>4</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
<tr class="hidden" data-changeId="4">
<td>4</td>
<td>Change Title</td>
<td>Change Description</td>
<td>Clarity Id</td>
<td>Package Description</td>
<td>Package Name</td>
<td>Package Status</td>
<td>Assigned To</td>
<td>New Package</td>
</tr>
</table>
注意 这一切都可以在客户端完成,但是当 table 完全展开时 javascript 会计算出什么隐藏。这对您的用户来说可能是一种不和谐的体验。