二进制文件未加载到 Radgrid 中
Binary file doesn't get loaded in Radgrid
我正在 telerik:RadGrid 中加载数据,但有一列未加载,其中包括文件(二进制数据)。
正如您在图像中看到的那样,此列没有加载数据库内容,而是仅加载 System.Byte
:
enter image description here
我现在绑定的代码是标准的
<telerik:GridBoundColumn DataField="FileContent"
FilterControlAltText="Filter por conteudo de ficheiro"
HeaderText="Ficheiro">`
关于如何加载预期内容有什么想法吗?
我没有 telrick 腰带。但是我们可以显示每一行,并为每一行说上面有一个按钮。当您单击该按钮时,它可以将 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() 数据,但允许单击按钮,并将字节文件流式传输(发送)到客户端。
我正在 telerik:RadGrid 中加载数据,但有一列未加载,其中包括文件(二进制数据)。
正如您在图像中看到的那样,此列没有加载数据库内容,而是仅加载 System.Byte
:
enter image description here
我现在绑定的代码是标准的
<telerik:GridBoundColumn DataField="FileContent"
FilterControlAltText="Filter por conteudo de ficheiro"
HeaderText="Ficheiro">`
关于如何加载预期内容有什么想法吗?
我没有 telrick 腰带。但是我们可以显示每一行,并为每一行说上面有一个按钮。当您单击该按钮时,它可以将 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() 数据,但允许单击按钮,并将字节文件流式传输(发送)到客户端。