我想在gridview中创建动态链接按钮,在Command事件中我想下载一个存储在数据库中的文件作为varbinary。
如果在rowdatabound方法中有以下代码:
var attachments = (from a in dbContext.Attachments.Where(i => (i.ID == id)) select a);
if (attachments.Any())
{
foreach (Attachments Att in attachments)
{
LinkButton lb = new LinkButton();
lb.CssClass = "download";
lb.Text = Att.FileName;
lb.CommandName = "Attachment";
lb.CommandArgument = Att.AttachmentID.ToString();
lb.Command += ShowAttachmentFile;
e.Row.Cells[4].Controls.Add(lb);
}
}
当我点击链接按钮时,将执行回发。 并且动态添加的链接按钮的每个属性都消失了。
如果我调试代码,则永远不会触发该函数。 commant事件方法的代码如下所示:
protected void ShowAttachmentFile(object sender, CommandEventArgs e)
{
int fileID = Int32.Parse(e.CommandArgument.ToString());
var downloadResult = (from a in dbContext.Attachments.Where(i => (i.id== fileID)) select a).First();
Byte[] bytes = (Byte[])downloadResult.Data;
Response.Buffer = true;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = downloadResult.ContentType;
Response.AddHeader("content-disposition", "attachment;filename="
+ downloadResult.FileName);
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
有人可以告诉我为什么在点击动态构建的链接按钮时不会触发该功能。
答案 0 :(得分:1)
问题是你需要在Postback上重新绑定GirdView。否则,当您回发时,这些动态填充的按钮将变为null,并且它们无法触发ShowAttachmentFile事件。
最简单的方法是在设计时在GridView中添加下载按钮。然后在运行时显示/隐藏 rowdatabound - foreach循环。
答案 1 :(得分:0)
感谢您的所有评论。 我通过删除isPostback检查解决了我的问题。