You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# ASP.NET WebForms按RegId分组展示Title与URL列表的实现方法

实现方案

你可以选择两种方案实现需求,分别是在C#后端对已拿到的DataTable做分组处理,或是直接修改存储过程在SQL层面完成分组拼接:

方案1:C#端处理(无需修改现有存储过程)

步骤1:引入所需命名空间

在你后台代码的顶部引入以下命名空间:

using System.Linq;
using System.Text;

步骤2:在按钮点击事件中添加分组逻辑

在你填充完DataTable的代码之后,追加如下代码:

// 按RegId和用户名分组
var regGroups = dataTable.AsEnumerable()
    .GroupBy(row => new 
    {
        RegId = row.Field<int>("RegId"),
        UserName = row.Field<string>("UserName") // 请替换为你表中实际存储用户名的字段名
    })
    .ToList();

StringBuilder resultBuilder = new StringBuilder();
foreach (var group in regGroups)
{
    // 拼接当前用户下所有Title+URL组合
    var urlItems = group.Select(row => $"{row.Field<string>("Title")} at {row.Field<string>("URL")}").ToList();
    string formatItems;
    if (urlItems.Count == 1)
    {
        formatItems = urlItems[0];
    }
    else
    {
        // 最后一项前加and,符合你要的展示效果
        formatItems = string.Join(", ", urlItems.Take(urlItems.Count - 1)) + " and " + urlItems.Last();
    }
    resultBuilder.AppendLine($"{group.Key.UserName} has {formatItems}.");
    resultBuilder.AppendLine(); // 不同用户之间加空行
}

// 页面上提前添加<asp:Literal ID="ltResult" runat="server" Mode="PassThrough" /> 控件用于展示结果
ltResult.Text = resultBuilder.ToString();

方案2:修改存储过程(SQL层面分组,数据量大时性能更优)

如果你使用的是SQL Server 2017及以上版本,可以直接用STRING_AGG函数在存储过程中完成分组拼接,减少后端处理逻辑:

修改后的存储过程代码

USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[spGetRegSess]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        RegId,
        UserName,
        STRING_AGG(CONCAT(Title, ' at ', URL), ', ') WITHIN GROUP (ORDER BY Title) AS SessList
    FROM RegSess
    GROUP BY RegId, UserName
END

对应的后端C#代码

存储过程修改后,后端无需再做分组,直接遍历结果即可:

StringBuilder resultBuilder = new StringBuilder();
foreach (DataRow row in dataTable.Rows)
{
    string userName = row.Field<string>("UserName");
    string sessList = row.Field<string>("SessList");
    // 处理最后一个逗号替换为and
    int lastCommaIndex = sessList.LastIndexOf(',');
    if (lastCommaIndex != -1)
    {
        sessList = sessList.Remove(lastCommaIndex, 1).Insert(lastCommaIndex, " and");
    }
    resultBuilder.AppendLine($"{userName} has {sessList}.");
    resultBuilder.AppendLine();
}
ltResult.Text = resultBuilder.ToString();

注意事项

  • 所有代码中的字段名请和你实际RegSess表的字段名保持一致,避免运行时报错
  • 若需要将URL展示为可点击的链接,拼接字符串时替换为<a href="{URL}" target="_blank">{Title}</a>格式即可

内容的提问来源于stack exchange,提问作者jtram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:06:01