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

C#中点击GridView的LinkButton如何获取未显示的submission_id主键值

实现点击科目LinkButton获取对应submission_id的最佳方案

这个需求的核心是把每个科目和它对应的submission_id关联起来,这样点击LinkButton时就能准确拿到目标值。下面是一套完整的实现步骤:

1. 调整查询语句,同步获取科目与submission_id列表

因为你需要为每个学生聚合多个考试科目,所以要同时聚合对应的submission_id,确保科目和submission_id的顺序完全对应。根据你使用的数据库类型,用对应的字符串聚合函数:

  • SQL Server 使用STRING_AGG:
SELECT 
    Name,
    STRING_AGG(Attended_Exam, ',') AS Attended_Exam,
    STRING_AGG(submission_id, ',') AS SubmissionIds
FROM your_table
GROUP BY Name
  • MySQL 使用GROUP_CONCAT:
SELECT 
    Name,
    GROUP_CONCAT(Attended_Exam SEPARATOR ',') AS Attended_Exam,
    GROUP_CONCAT(submission_id SEPARATOR ',') AS SubmissionIds
FROM your_table
GROUP BY Name

这样你的DataTable会新增一列SubmissionIds,里面的每个值和Attended_Exam里的科目一一对应。

2. 优化GridView配置,隐藏辅助列

如果保持AutoGenerateColumns="true",新增的SubmissionIds列会被显示出来,影响界面。建议改为手动配置列,隐藏该辅助列:

<asp:GridView ID="gvSubmissionHeaders" runat="server" AutoGenerateColumns="false" Width="80%" 
    OnRowDataBound="gvSubmissionHeaders_RowDataBound" 
    OnRowCommand="gvSubmissionHeaders_RowCommand"
    Font-Bold="false" RowStyle-Height="30px" >
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:TemplateField HeaderText="Attended_Exam">
            <ItemTemplate></ItemTemplate>
        </asp:TemplateField>
        <%-- 隐藏存储submission_id列表的列,仅用于后台取值 --%>
        <asp:BoundField DataField="SubmissionIds" Visible="false" />
    </Columns>
</asp:GridView>

3. 修改RowDataBound事件,为LinkButton绑定submission_id

在创建每个科目LinkButton时,把对应的submission_id赋值给CommandArgument,同时设置CommandName方便后续识别:

protected void gvSubmissionHeaders_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 获取当前行的科目列表和对应的submission_id列表
        string exams = DataBinder.Eval(e.Row.DataItem, "Attended_Exam").ToString();
        string submissionIds = DataBinder.Eval(e.Row.DataItem, "SubmissionIds").ToString();
        
        if (!string.IsNullOrEmpty(exams) && exams != "&nbsp;")
        {
            string[] arrExams = exams.Split(',');
            string[] arrSubmissionIds = submissionIds.Split(',');
            
            // 清空模板列的默认内容
            e.Row.Cells[1].Controls.Clear();
            
            for (int i = 0; i < arrExams.Length; i++)
            {
                LinkButton btnLink = new LinkButton();
                btnLink.ID = $"lnkExam_{i}_{e.Row.RowIndex}"; // 确保ID唯一
                btnLink.Text = arrExams[i] + "<br>";
                
                // 将对应科目的submission_id绑定到CommandArgument
                btnLink.CommandArgument = arrSubmissionIds[i];
                // 设置统一的CommandName,方便在RowCommand中识别
                btnLink.CommandName = "GetSubmissionId";
                
                e.Row.Cells[1].Controls.Add(btnLink);
            }
        }
    }
}

4. 实现RowCommand事件处理点击逻辑

在后台添加RowCommand事件处理方法,获取点击的submission_id并执行你的业务逻辑:

protected void gvSubmissionHeaders_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "GetSubmissionId")
    {
        // 获取对应的submission_id
        string targetSubmissionId = e.CommandArgument.ToString();
        
        // 这里执行你需要的操作,比如跳转详情页、弹窗展示信息等
        // 示例:
        // Response.Redirect($"SubmissionDetail.aspx?submissionId={targetSubmissionId}");
        // 或者显示提示:
        ClientScript.RegisterStartupScript(this.GetType(), "alert", $"alert('对应submission_id:{targetSubmissionId}');", true);
    }
}

关键注意事项

  • 务必保证查询出来的Attended_Exam和SubmissionIds的元素数量、顺序完全一致,否则会出现科目与submission_id不匹配的问题。
  • 如果你的DataTable不是通过聚合生成的(比如每行对应一个学生的一个科目),建议调整为聚合查询的方式,这样GridView的展示更符合需求,也更高效。
  • LinkButton的ID要保证唯一,避免页面控件ID冲突,上面的代码用行索引+循环索引来生成唯一ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:17:47