问题描述
我正在通过 asp.net C# 中的 FromBase64String 方法从字节转换图像并放置在 gridview 字段中,但在 gridview 中它在该位置显示 [object object] 数据图像。
看图更清晰,
这是 CustomerMortgageModel 模型,
public class CustomerMortgageModel
{
public Image DesignImage;
}
这是前端代码,
[WebMethod]
public static List<CustomerMortgageModel> GetProductList()
{
string constr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
List<CustomerMortgageModel> customers = new List<CustomerMortgageModel>();
Service service = new Service();
using (sqlConnection con = new sqlConnection(constr))
{
string qrySelProductDetail = "select * from tbl_MortageDetail " + System.Environment.NewLine;
using (sqlCommand cmd = new sqlCommand(qrySelProductDetail,con))
{
con.open();
using (sqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
// Setup image and get data stream together
System.Drawing.Image img;
System.IO.MemoryStream MS = new System.IO.MemoryStream();
if (sdr["DesignImage"].ToString() != "")
{
string k = "i" + sdr["DesignImage"].ToString();
string b64 = k.Replace(" ","+");
byte[] b;
// Converts the base64 encoded msg to image data
b = Convert.FromBase64String(b64);
MS = new System.IO.MemoryStream(b);
//creates image
img = System.Drawing.Image.FromStream(MS);
}
else
{
img = null;
}
customers.Add(new CustomerMortgageModel
{
DesignImage = img
});
}
}
con.Close();
}
}
return customers;
}
后端代码,
<asp:GridView ID="gv_productdetail" runat="server" CssClass="display compact" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<img src="data:image/jpeg;base64,<%# Eval("DesignImage") %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
解决方法
好吧,你没有注意到数据库列的格式,但假设我们有这个标记:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Animal Name" DataField="Animal" />
<asp:TemplateField HeaderText="Picture">
<ItemTemplate>
<asp:Image ID="Image1" runat="server"
Height="128px" Width="128px"
src ='<%# "Data:Image/png;base64," + Convert.ToBase64String((byte[])Eval("ImageB")) %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
注意我是如何将表达式放在标记中的。所以,现在加载网格的代码将如下所示:
protected void Page_Load(object sender,EventArgs e)
{
if (!IsPostBack) {
LoadGrid();
}
}
void LoadGrid()
{
using (SqlCommand cmdSQL = new SqlCommand("SELECT Animal,ImageB from tblAnimals",new SqlConnection(Properties.Settings.Default.TEST4)))
{
cmdSQL.Connection.Open();
GridView1.DataSource = cmdSQL.ExecuteReader();
GridView1.DataBind();
}
}
输出:
所以,这里真的没有必要使用流阅读器。我假设您的示例标记是针对此发布的 - 并且缺少一些数据绑定字段。
但是,您可以推/扔/使用 sql 命令对象的数据读取器对象。无需在此处循环。
这实际上取决于您背后的附加代码是什么样的。如果您正在使用额外的数据行,那么我建议您考虑使用数据表,因为在行数据绑定事件中,您可以充分利用该数据行。
所以,你可以考虑一下:
cmdSQL.Connection.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader());
GridView1.DataSource = rstData;
GridView1.DataBind();
但是,如果您在行数据绑定事件期间需要完整的数据行(我不知道您是否正在使用),我只会在上面建议。
但是,您当然不需要像您发布的那样多的代码来执行此操作。我假设上面的 sql 数据列类型是“图像”,如果它是/也是二进制类型,上面也应该工作。