使用 ASP.NET 将数据与数据表分组
Posted
技术标签:
【中文标题】使用 ASP.NET 将数据与数据表分组【英文标题】:Grouping data with datatable with ASP.NET 【发布时间】:2017-12-09 06:29:25 【问题描述】:我无法对下表格式的数据进行分组,并尝试按照第二种表格格式对数据进行分组
legacy subid converted licPart count
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL AC CE E-LTU LIC-CP-EN-100 100
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OB USR E-LTU LIC-CP-EN-100 100
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OG EP E-LTU LIC-CP-EN-100 100
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL AC CE E-LTU LIC-CP-EN-100 100
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OB USR E-LTU LIC-CP-EN-100 100
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OG EP E-LTU LIC-CP-EN-100 100
Ent 1K EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL AC CE E-LTU LIC-CP-EN-1K 1000
Ent 1K EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OB USR E-LTU LIC-CP-EN-1K 1000
Ent 1K EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL OG EP E-LTU LIC-CP-EN-1K 1000
我正在尝试获取如下所示的数据,以便进一步分配给中继器以显示信息
Ent 100 EP Lic E-LTU 7ks7gp-qc42sn-g7zk0q-7pzmb7-xdp6yb NL AC CE E-LTU LIC-CP-EN-100 100
NL OB USR E-LTU
NL OG EP E-LTU
Ent 100 EP Lic E-LTU NL AC CE E-LTU LIC-CP-EN-100 100
NL OB USR E-LTU
NL OG EP E-LTU
Ent 1K EP Lic E-LTU NL AC CE E-LTU LIC-CP-EN-1K 1000
NL OB USR E-LTU
NL OG EP E-LTU
我在 rowdatabound 事件期间尝试使用网格视图,它工作正常,但我无法使用中继器获得相同的结果。我确信我们需要在将数据分配给转发器之前对数据进行分组
但我不确定如何像上面提到的那样对数据进行分组
这是我的中继器代码
<asp:Repeater ID="RepeaterEnterprise" runat="server" OnItemDataBound="ItemBound">
<HeaderTemplate>
<table>
<tr>
<th>Avaialable Endpoints
</th>
<th>Converted Endpoints
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<table>
<tr>
<td>
<asp:TextBox runat="server" ID="txtAvaialble" Text='<%#Eval("LicenseCount") %>' ReadOnly="true">
</asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtConverted" Text='' ReadOnly="true">
</asp:TextBox>
</td>
<td>
<tr>
<td>
<asp:Label ID="lblcount" runat="server" Text='<%# Eval("Converted") %>'></asp:Label>
</td>
<td>25*
</td>
</tr>
</table>
<table>
<tr>
<td>
<asp:TextBox runat="server" ID="txtEndpoints" Text=''>
</asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtTotalEndPoints" Text='' ReadOnly="true">
</asp:TextBox>
</td>
</tr>
</table>
</td>
</tr>
</ItemTemplate>
<SeparatorTemplate>
<tr>
<td>
</td>
</tr>
</SeparatorTemplate>
<AlternatingItemTemplate>
<table>
<tr>
<td>
<asp:TextBox runat="server" ID="txtAvaialbleEndPoints" Text='<%#Eval("Count") %>' ReadOnly="true">
</asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtConvertedEndPoints" Text='' ReadOnly="true">
</asp:TextBox>
</td>
<td>
<tr>
<td>
<asp:Label ID="lblcountryname" runat="server" Text='<%# Eval("Converted") %>'></asp:Label>
</td>
<td>25*
</td>
</tr>
</table>
<table>
<tr>
<td>
<asp:TextBox runat="server" ID="txtEndpoints" Text=''>
</asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtTotalEndPoints" Text='' ReadOnly="true">
</asp:TextBox>
</td>
</tr>
</table>
</AlternatingItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
有人知道这个解决方案如何进行分组吗?
【问题讨论】:
只是想知道,前 3 行与第 4-6 行相同。那是真实的数据吗?它可能会影响答案。 @wazz 它的真实数据是的,我们可能会得到另外两个相同类型的数据 任何人都可以就这个分组提出任何想法... 【参考方案1】:分组规则在您最初的问题中并不明显,但根据您的 cmets,我认为您需要
按subid等标识符对记录进行分组 如果 converted 字段多次显示,则多次显示 subid 结果我想你有一些类似于下面的类
public class InputModel
public string legacy get; set;
public string subid get; set;
public string converted get; set;
public string licPart get; set;
public string count get; set;
public class OutputModel
public string legacy get; set;
public string subid get; set;
public IList<string> list get; set;
public string licPart get; set;
在其他解决方案中,您可以依赖 reducer/fold/aggregate 方法,为此,C# 可以使用可枚举的 .Aggregate(在 here 中也可以找到一些很好的示例) p>
var seed = new List<OutputModel>();
var outcome = records
.Aggregate(seed, (results, current) =>
var query = from result in results
where result.legacy == current.legacy
&& (result.list == null
|| !result.list.Contains(current.converted))
select result;
var output = query.FirstOrDefault();
if (output == null)
output = new OutputModel
legacy = current.legacy,
subid = current.subid,
licPart = current.licPart,
list = new List<string>
current.converted
;
results.Add(output);
else
output.list.Add(current.converted);
return results;
);
会给你这个
编辑
根据要求,请参阅下面将表映射到输入记录集合的一种方法
public static class Extensions
public static IEnumerable<InputModel> Map(this DataTable instance)
foreach (DataRow row in instance.Rows)
yield return new InputModel
legacy = (string)row[0],
subid = (string)row[1],
converted = (string)row[2],
licPart = (string)row[3],
count = (string)row[4],
;
【讨论】:
感谢您的支持,但我需要第二个数据格式中提到的分组.. 第一个项目的最后一个列表我有三个项目和第二个项目(LIC-CP-EN-1k)我有 1 个,然后是第三个项目 (LIC_EN_CP_1k) 两个项目.. 我还需要为第二个和第三个项目获得三个项目 您要用于分组的业务逻辑起初并不那么清楚,但我已经更新了我的答案以反映您的额外细节。看全图的要点gist.github.com/dandohotaru/724d1206c79631219de338f44a8ee61b 我正在从数据表中获取该数据,但我不确定如何将此逻辑应用于数据表.. 您只需要遍历表的行并将 table.row[index] 提取到您进一步分配的值以上是关于使用 ASP.NET 将数据与数据表分组的主要内容,如果未能解决你的问题,请参考以下文章
将 ASP.NET PageMethods 与 JQuery 数据表一起使用?
使用 Windows 7 x64 将 ASP.NET 与 Access 数据库 2010 连接