使用 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 将数据与数据表分组的主要内容,如果未能解决你的问题,请参考以下文章

数据表 C# ASP.NET 中的分组和小计

如何在 ASP.NET MVC 视图中对数据进行分组?

将 ASP.NET PageMethods 与 JQuery 数据表一起使用?

使用 Windows 7 x64 将 ASP.NET 与 Access 数据库 2010 连接

ASP.NET开发实战——ASP.NET MVC 与数据库之MySQL

ASP.NET开发实战——ASP.NET与数据库