ASP.NET GridView合并行后实现单单元格多独立文档链接
解决GridView合并行后文档链接独立的问题
你的核心问题在于用STUFF把多个dID合并成了单个字符串,导致绑定到LinkButton时无法区分每个独立文档。你尝试的Repeater思路是对的,但没根据当前行的qID过滤文档,所以才会显示所有文档。下面给你两种可行的解决方案:
方法1:修复Repeater实现(推荐)
首先修改GridView的模板列,把单个LinkButton替换成Repeater,用来渲染多个独立链接:
<asp:TemplateField HeaderText="Documents Link"> <ItemTemplate> <asp:Repeater ID="rpDocument" runat="server"> <ItemTemplate> <asp:LinkButton ID="lnkDocument" runat="server" Text='<%# Eval("dID") %>' ToolTip='<%# Eval("dName") %>' CommandArgument='<%# Eval("dID") %>' OnClick="lnkDocument_Click" Style="margin-right: 8px;" ></asp:LinkButton> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:TemplateField>
然后在RowDataBound事件中,根据当前行的qID查询对应文档,而不是查询所有文档:
protected void gvQuote_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // 获取当前行的qID int qID = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "qID")); Repeater rp = (Repeater)e.Row.FindControl("rpDocument"); using (SqlCommand cmd = new SqlCommand("SELECT dID, dName FROM tblDocuments WHERE qID = @qID", tcf)) { cmd.Parameters.AddWithValue("@qID", qID); DataTable dt = new DataTable(); using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { da.Fill(dt); rp.DataSource = dt; rp.DataBind(); } } } }
这样每个Repeater只会渲染当前行对应的文档,每个文档都是独立的LinkButton,你的lnkDocument_Click事件代码不需要修改,就能正常下载对应文档。
方法2:动态生成LinkButton(无需Repeater)
如果不想用Repeater,可以直接在RowDataBound事件中手动创建LinkButton并添加到单元格:
protected void gvQuote_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { int qID = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "qID")); // 找到DocID对应的单元格(根据你的列索引调整,这里假设是第4列,索引从0开始) TableCell docCell = e.Row.Cells[3]; docCell.Controls.Clear(); // 清空原来合并后的文本 using (SqlCommand cmd = new SqlCommand("SELECT dID, dName FROM tblDocuments WHERE qID = @qID", tcf)) { cmd.Parameters.AddWithValue("@qID", qID); tcf.Open(); using (SqlDataReader sdr = cmd.ExecuteReader()) { while (sdr.Read()) { LinkButton lnk = new LinkButton(); lnk.ID = $"lnkDoc_{sdr["dID"]}"; lnk.Text = sdr["dID"].ToString(); lnk.ToolTip = sdr["dName"].ToString(); lnk.CommandArgument = sdr["dID"].ToString(); lnk.Click += lnkDocument_Click; lnk.Style.Add("margin-right", "8px"); docCell.Controls.Add(lnk); // 添加空格分隔不同链接 docCell.Controls.Add(new LiteralControl(" ")); } } tcf.Close(); } } }
这种方法不需要修改GridView的模板列,直接替换单元格内容,效果和Repeater一致。
额外优化(可选)
如果担心多次查询数据库影响性能,可以在初始查询时,把每个qID对应的文档数据一起加载(比如用DataSet关联表),不过对于小规模数据,上面两种方法已经足够满足需求。
内容的提问来源于stack exchange,提问作者MartinD
相关产品推荐
相关产品推荐

