【问题标题】:Binary file doesn't get loaded in Radgrid二进制文件未在 Radgrid 中加载
【发布时间】:2026-02-15 07:20:03
【问题描述】:

我正在 Telerik:RadGrid 中加载数据,但我有一列未加载,其中包括文件(二进制数据)。

正如您在图片中看到的,此列不加载 DB 内容,而是加载 System.Byte

enter image description here

我当前绑定的代码是标准的

<telerik:GridBoundColumn DataField="FileContent" 
         FilterControlAltText="Filter por conteudo de ficheiro"        
         HeaderText="Ficheiro">`

关于如何加载预期内容的任何想法?

【问题讨论】:

  • 字节由什么组成,是图像文件吗?声音文件?加密数据?
  • @LasseV.Karlsen 有excel文件
  • 好吧,网格不会在每个单元格内呈现 excel。您必须提供按钮单击或类似的操作才能获取行,然后将 excel 字节数据流式传输到客户端浏览器。所以你不能显示,而且真的不想在那个网格中包含字节列——它无论如何都不能显示,所以把它从网格显示中删除。如果您想单击一些按钮来获取或下载 Excel 表,那么这是您遗漏的问题的很大一部分,对吧?但即使这是您的问题,您也必须从网格中删除该列 - 它无法显示 excel。
  • @AlbertD.Kallal 是的,我认为它更复杂.. 我理解你的解释,会继续努力
  • 好吧,编辑你的问题。只需声明我在网格中有数据行,我希望用户选择特定的行来提取我在数据库中的一个字节二进制列,它是一个 excel 文件。所以,我会为那个单元格添加一个按钮——也许是一个带有 Excel 徽标的图像按钮。当您单击它时,它会将字节流式传输到浏览器。您可以选择将此结果保存在下载文件中,或者实际上让浏览器直接打开工作表。

标签: asp.net entity-framework telerik-grid .net-framework-4.8


【解决方案1】:

我没有telrick gird。但是我们可以显示每一行,并且每行都有一个按钮。当您单击该按钮时,它可以将该 bytes() 列从浏览器下载到客户端计算机。

所以,假设我们有这个:

        <div style="width:40%">
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="ID" CssClass="table" >
                <Columns>
                    <asp:BoundField DataField="FileName" HeaderText="FileName"        />
                    <asp:BoundField DataField="MineType" HeaderText="MineType"        />
                    <asp:BoundField DataField="Description" HeaderText="Description"  />

                    <asp:TemplateField HeaderText="View">
                        <ItemTemplate>
                            <asp:ImageButton ID="cmdExcel" runat="server" Height="48px" Width="48px" 
                                ImageUrl="~/Content/excel.png"
                                OnClick="cmdExcel_Click" />
                        </ItemTemplate>
                    </asp:TemplateField>

                </Columns>
            </asp:GridView>

我们的数据库有一个名为 FileB 的列(excel 文件的再见)。

因此,我们可以加载网格,但不包括 Excel 文件。但是,我们确实按照上面的方法在网格中放置了一个按钮。

因此,填充网格的代码如下所示:

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

    void LoadGrid()
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            string strSQL = "SELECT ID, FileName, MineType, Description FROM tblFiles";
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                GridView1.DataSource = cmdSQL.ExecuteReader();
                GridView1.DataBind();
            }
        }
    }

    DataTable MyRst(string strSQL)
    {
        DataTable rst = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
            conn.Open();
            rst.Load(cmdSQL.ExecuteReader());
            }
        }
        return rst;
    }

现在我们有了这个:

请注意,我们不仅保存了文件名,还保存了“我的”类型。 .net 4.5(或更高版本)有一个名为 GetMineType 的内置函数 - 您可以将文件名传递给它,它会生成正确的地雷类型。

所以,在上面,当你点击“图像按钮”时,我们有这段代码从数据库中获取字节,并将其发送给客户端:

  protected void cmdExcel_Click(object sender, ImageClickEventArgs e)
    {
        ImageButton btn = (ImageButton)sender;

        GridViewRow gRow = (GridViewRow)btn.Parent.Parent;
        int PKID = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];

        // get data from table
        DataRow rstData = MyRst("SELECT FileB, FileName, MineType from tblFiles where ID = " + PKID).Rows[0];
        Byte[] binFile = (Byte[])rstData["FileB"];

        Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();

        Response.ContentType = rstData["MineType"].ToString();
        Response.AddHeader("Content-Disposition", "inline; filename=" + rstData["FileName"]);

        Response.BinaryWrite(binFile);

        Response.End();

    }

如前所述,大多数网格,无论是网格视图、列表视图还是 Telerick 网格都应该类似地工作。因此,您不会在网格中包含 bytes() 数据,而是允许单击按钮,并将字节文件向下(发送)到客户端。

【讨论】:

  • 非常感谢您的解释。