亲爱的我在GridView中显示图像,此图像以varbinary Format,其内容类型和图像名称保存在数据库中。而且我在GridView中的图像显示完美,现在我想从GridView插入相同的图像到GridView外面的按钮,我该如何实现此件事,任何人可以指导我吗?我尝试通过从GridView(例如Varbinary Data(接收此图像数据来实现它 - 它是数据库,内容类型和ImageName中的图像中的图像,但它却被带到文本框中,但不允许从数据类型Nvarchar到Varbinary(Max(的错误转换。使用转换函数运行此查询"
<asp:TemplateField HeaderText="" ItemStyle-Width="" Visible="true">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" class="preview" ToolTip='<%#Bind("StaffName") %>'
NavigateUrl='' runat="server">
<asp:ImageButton runat="server" ID="Image2" class="img2" ImageUrl='<%# Eval("ImageName") %>'
CommandName='<%# Eval("Id") %>' CommandArgument='<%# Eval("ImageName") %>' />
</asp:HyperLink>
<asp:TextBox ID="txtFileType" runat="server" Text='<%# Eval("FileType") %>' Visible="true"></asp:TextBox>
<asp:TextBox ID="txtBData" runat="server" Text='<%# Eval("BData") %>' Visible="true"></asp:TextBox>
<asp:TextBox ID="txtImageName" runat="server" Text='<%# Eval("ImageName") %>' Visible="true"></asp:TextBox>
<br />
<br />
</ItemTemplate>
<ControlStyle Width="100%" />
<HeaderStyle HorizontalAlign="Left" VerticalAlign="Middle" Width="10%" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="20%" />
</asp:TemplateField>
foreach (GridViewRow row1 in gvImage.Rows)
{
if (row1.RowType == DataControlRowType.DataRow)
{
// txtFileType
// txtBData
// txtImageName
TextBox txtFileType, txtBData, txtImageName;
txtFileType = (row1.Cells[1].FindControl("txtFileType") as TextBox);
txtBData = (row1.Cells[1].FindControl("txtBData") as TextBox);
txtImageName = (row1.Cells[1].FindControl("txtImageName") as TextBox);
string constr = ConfigurationManager.ConnectionStrings["CONNECTION"].ConnectionString;
using (SqlConnection con8 = new SqlConnection(constr))
{
string query = "insert into SShare (FId,UDetails,ShareBy,ShareByUserId,BData,FileType,ImageName) values(@FId,@UDetails,@ShareBy,@ShareByUserId,@BData,@FileType,@ImageName)";
using (SqlCommand cmd8 = new SqlCommand(query))
{
cmd8.Parameters.AddWithValue("@FId", txt_Tester.Text);
cmd8.Parameters.AddWithValue("@UDetails", TextBox1.Text);
cmd8.Parameters.AddWithValue("@ShareBy", txt_StaffId.Text);
cmd8.Parameters.AddWithValue("@ShareByUserId", txt_Employee.Text);
cmd8.Parameters.AddWithValue("@BData", txtBData.Text);
cmd8.Parameters.AddWithValue("@FileType", txtFileType.Text);
cmd8.Parameters.AddWithValue("@ImageName", txtImageName.Text);
con8.Open();
// cmd8.ExecuteNonQuery();
this.ExecuteQuery(cmd8, "SELECT");
con8.Close();
}
}
}
}
这是我建议的。您可以从网格中获取所有数据,但也可以在SQL中进行。
注意BDAta
是不是 a SqlParameter
,它是从Employee
表中拉出的:
INSERT INTO [SShare](FId,UDetails,ShareBy,ShareByUserId,BData,FileType,ImageName)
SELECT @FId, @UDetails, @ShareBy, @ShareByUserId, BData, @FileType, @ImageName
FROM Employee
WHERE FId = @FId;
在无处不在的地方跳动头后,我想出了,如果有人可以提及的话,我将其发布。感谢@CrowCoder提供了逻辑来实现它。
foreach (GridViewRow row1 in gvImage.Rows)
{
if (row1.RowType == DataControlRowType.DataRow)
{
string Id = gvImage.DataKeys[row1.RowIndex].Value.ToString();
ImageButton imgbtn = (ImageButton)gvImage.Rows[row1.RowIndex].FindControl("Image2");
string filename = imgbtn.ImageUrl;
TextBox ftype = (row1.FindControl("txtFileType") as TextBox);
byte[] bytes = (byte[])GetData("SELECT BData FROM Employee WHERE Id =" + txt_StaffId.Text).Rows[0]["BData"];
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
imgbtn.ImageUrl = "data:image/png;base64," + base64String;
{
string constr = ConfigurationManager.ConnectionStrings["CONNECTION"].ConnectionString;
using (SqlConnection con8 = new SqlConnection(constr))
{
string query = "insert into SShare (FId,UDetails,ShareBy,ShareByUserId,BData,ImageName, FileType) values(@FId,@UDetails,@ShareBy,@ShareByUserId,@BData,@ImageName,@FileType)";
using (SqlCommand cmd8 = new SqlCommand(query))
{
cmd8.Parameters.AddWithValue("@FId", txt_Tester.Text);
cmd8.Parameters.AddWithValue("@UDetails", TextBox1.Text);
cmd8.Parameters.AddWithValue("@ShareBy", txt_StaffId.Text);
cmd8.Parameters.AddWithValue("@ShareByUserId", txt_Employee.Text);
cmd8.Parameters.AddWithValue("@BData", bytes);
cmd8.Parameters.AddWithValue("@ImageName", filename);
cmd8.Parameters.AddWithValue("@FileType", ftype.Text);
con8.Open();
// cmd8.ExecuteNonQuery();
this.ExecuteQuery(cmd8, "SELECT");
con8.Close();
}
}
}
}
}