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

ASP.NET GridView添加下载/删除按钮失败问题求助

问题分析与修复方案

你的GridView下载、删除按钮无法正常显示/触发的核心问题有以下几点:

  1. 按钮命令名不匹配:ButtonTemplate中固定把CommandName设为CustomCommand,但RowCommand事件里判断的是Download和Delete,导致按钮点击后逻辑无法触发;同时直接把绑定表达式字符串传给CommandArgument,没有实际解析出文件名。
  2. AutoGenerateColumns冲突:GridView开启了AutoGenerateColumns="true",动态添加TemplateField的时机和自动列生成逻辑冲突,导致按钮列无法正确渲染。

修复步骤

1. 重构ButtonTemplate类

修改模板类,支持自定义CommandName,并通过数据绑定事件正确获取文件名:

public class ButtonTemplate : ITemplate
{
    private string _buttonText;
    private string _commandName;
    private string _dataFieldName;

    public ButtonTemplate(string buttonText, string commandName, string dataFieldName)
    {
        _buttonText = buttonText;
        _commandName = commandName;
        _dataFieldName = dataFieldName;
    }

    public void InstantiateIn(Control container)
    {
        LinkButton btn = new LinkButton();
        btn.CommandName = _commandName;
        btn.Text = _buttonText;
        btn.ID = "lnkButton";
        btn.CssClass = "myButtonStyle";
        
        // 绑定数据时动态获取文件名作为CommandArgument
        btn.DataBinding += (sender, e) =>
        {
            LinkButton currentBtn = (LinkButton)sender;
            GridViewRow row = (GridViewRow)currentBtn.NamingContainer;
            string fieldValue = DataBinder.Eval(row.DataItem, _dataFieldName).ToString();
            currentBtn.CommandArgument = HttpUtility.HtmlEncode(fieldValue);
        };
        
        container.Controls.Add(btn);
    }
}

2. 修改BindGridView1方法

关闭自动列生成,手动绑定数据列和按钮列,确保列渲染顺序正确:

private void BindGridView1()
{
    string apiUrl = "http://mesappbeta/BE_API_HOME/api/SeriesBlacklist/Req_UploadedDocs?series=AE01400&series_type=RU";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage response = client.GetAsync(apiUrl).Result;
        if (response.IsSuccessStatusCode)
        {
            string json = response.Content.ReadAsStringAsync().Result;
            Root data = JsonConvert.DeserializeObject<Root>(json);

            DataTable dt = new DataTable();
            dt.Columns.Add("File Name");
            dt.Columns.Add("File Type");
            dt.Columns.Add("Uploaded Date");

            foreach (var item in data.data)
            {
                DataRow row = dt.NewRow();
                row["File Name"] = item.file_name;
                row["File Type"] = item.file_type;
                row["Uploaded Date"] = item.created_datetime;
                dt.Rows.Add(row);
            }

            // 关闭自动列生成,避免冲突
            GridView2.AutoGenerateColumns = false;

            // 手动添加数据列
            BoundField fileNameCol = new BoundField();
            fileNameCol.DataField = "File Name";
            fileNameCol.HeaderText = "File Name";
            GridView2.Columns.Add(fileNameCol);

            BoundField fileTypeCol = new BoundField();
            fileTypeCol.DataField = "File Type";
            fileTypeCol.HeaderText = "File Type";
            GridView2.Columns.Add(fileTypeCol);

            BoundField uploadDateCol = new BoundField();
            uploadDateCol.DataField = "Uploaded Date";
            uploadDateCol.HeaderText = "Uploaded Date";
            GridView2.Columns.Add(uploadDateCol);

            // 添加下载按钮列
            TemplateField downloadField = new TemplateField();
            downloadField.HeaderText = "Download";
            downloadField.ItemTemplate = new ButtonTemplate("Download", "Download", "File Name");
            downloadField.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
            GridView2.Columns.Add(downloadField);

            // 添加删除按钮列
            TemplateField deleteField = new TemplateField();
            deleteField.HeaderText = "Delete";
            deleteField.ItemTemplate = new ButtonTemplate("Delete", "Delete", "File Name");
            deleteField.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
            GridView2.Columns.Add(deleteField);

            GridView2.DataSource = dt;
            GridView2.DataBind();
        }
    }
}

3. 调整ASPX页面GridView配置

移除未实现的OnRowDeleting事件,保持配置简洁:

<asp:GridView ID="GridView2" runat="server" OnRowCommand="GridView2_RowCommand" AutoGenerateColumns="false">
</asp:GridView>

4. 优化Page_Load方法

移除多余的async修饰符(因为BindGridView1是同步方法):

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGridView1();
    }
}

核心修复说明

  • 模板类通过DataBinding事件动态获取绑定数据,避免直接传递未解析的表达式字符串
  • 关闭自动列生成后,手动控制所有列的渲染顺序,确保按钮列能正确显示
  • 按钮的CommandName与RowCommand事件中的判断逻辑完全匹配,点击后能触发对应的下载/删除逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:11