c# - 我可以只输出数据表中值的第一个实例吗?

标签 c# .net datatable

是否可以只输出存储在数据表中的值的第一个实例?

我的示例是这样 = 我有一个数据表,其中每一行都包含月份的名称。该表按月升序排列。我只想在表格中第一次出现时输出月份的名称 - 如果月份有五个条目,则文本“January”只需要输出一次。

我正在使用转发器 - 下面的代码。 Month 中的值只有在与上一行中的值不同时才应更改。

<asp:Repeater ID="rptEvents" runat="server">
    <ItemTemplate>
    <h5><%#Eval("Month")%></h5>     
        <p>
            <strong><asp:HyperLink ID="hlEvents" runat="server" Text='<%#Eval("Title") %>' NavigateUrl='<%#Eval("QuickLink") %>'></asp:HyperLink></strong><br />
    <%#Eval("Date") %><br />
    <%#Eval("Description") %>
    </p>
    </ItemTemplate>
</asp:Repeater>

最佳答案

我建议有 2 个中继器。外部将绑定(bind)到月份列表,内部将绑定(bind)月份内的所有条目:

<asp:Repeater ID="MonthList" runat="server" OnItemDataBound="MonthList_ItemDataBound">
    <ItemTemplate>
        <h2><%# Container.DataItem %></h2>
        <asp:Repeater ID="ItemList" runat="server">
            <ItemTemplate><%# Eval("Name") %></ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

对于此标记代码,后面可能如下所示:

public partial class _Default : System.Web.UI.Page
{
    public class Entry
    {
        public string Month {get;set;}
        public string Name {get;set;}
    }

    List<Entry> entries = new List<Entry>()
    {
        new Entry() { Month = "Jan", Name = "name1"},
        new Entry() { Month = "Jan", Name = "name2"},
        new Entry() { Month = "Feb", Name = "name3"},
        new Entry() { Month = "Aug", Name = "name4"},
        new Entry() { Month = "Dec", Name = "name5"},
        new Entry() { Month = "Dec", Name = "name6"}
    };

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            MonthList.DataSource = entries.GroupBy(x => x.Month).Select(x => x.Key);
            MonthList.DataBind();
        }
    }

    protected void MonthList_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var itemList = (Repeater)e.Item.FindControl("ItemList");
            var month = (string)e.Item.DataItem;
            itemList.DataSource = entries.Where(x => x.Month == month);
            itemList.DataBind();
        }
    }
}

我对示例使用了内存中集合,并使用 Linq 对其进行了转换。首先,我们按月份对数据源进行分组。然后,在 MonthList_ItemDataBound 中,对于每个被绑定(bind)的月份,我们寻找内部转发器并将其与按当前 (DataItem) 月份过滤的集合绑定(bind)。希望这会有所帮助。

关于c# - 我可以只输出数据表中值的第一个实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5482292/

相关文章:

c# - 在无序日志文件中搜索

c# - 这个 goto 有表现力吗?

c# - 一路async await async

r - R中数据表的奇怪情况,列名混合

c# - 手动创建的 global.asax.cs 文件不起作用

c# - 一种使用反射访问所有资源值的方法

.net - IEnumerable.Min() 返回带有通用对象的奇怪结果

c# - 抛出异常的未等待任务的内存泄漏?

php - 插入在数据表复选框中选中的数据 codeigniter

MATLAB - 根据某些标准提取表中的选定行