当不存在图像时,在网格视图中隐藏图像控件

本文关键字:图像 视图 隐藏 网格 控件 不存在 | 更新日期: 2023-09-27 18:36:28

我有一个问题开始让我感到沮丧。我使用网格视图创建了一个非常简单的博客。我得到了另一个要求,即能够将图像上传到帖子中。我遇到的问题是,如果用户创建了一个没有图片的帖子,图像控件仍然会显示红色的 x。我尝试了多种方法,但没有成功。我正在使用自定义处理程序来获取帖子的图像。

ImageHandler.ashx

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dboBlog"].ConnectionString);
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            string messageid = context.Request.QueryString["mid"];
            conn.Open();
            SqlCommand command = new SqlCommand("SELECT Image from BlogImages WHERE Image IS NOT NULL AND MessageID=" + messageid, conn);
            SqlDataReader dr = command.ExecuteReader();
            dr.Read()
            context.Response.BinaryWrite((Byte[])dr[0]);
            conn.Close();
            context.Response.End();
        }
        catch (Exception ex)
        {
            return;
        }
    }

我确实有一个与帖子表相关的图像表。如您所见,它使用 QueryString 并检索 MessageID 或 Posts ID,然后显示图像。

这是我目前在帖子中.aspx图像控件的内容。

.ASP

<asp:Image ID="postImage" runat="server" ImageUrl='<%# "ImageHandler.ashx?mid="+ Eval("MessageID") %>' Width="300px" Height="300px" GenerateEmptyAlternateText="True" />
我已经在这里尝试

了解决方案,也在这里尝试了解决方案,但对我来说没有任何成功。我尝试使用 Visible 属性,只显示不是"null"但结果相同的图像。如果还需要我做什么,请告诉我!

编辑:这是我现在对ImageHandler.ashx所拥有的

ImageHandler.ashx

// 1x1 transparent GIF
        private readonly byte[] GifData =
        {
            0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
            0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
            0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
            0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
            0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
            0x02, 0x44, 0x01, 0x00, 0x3b
        };
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dboBlog"].ConnectionString);
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            string messageid = context.Request.QueryString["mid"];
            conn.Open();
            SqlCommand command = new SqlCommand("SELECT Image from BlogImages WHERE Image IS NOT NULL AND MessageID=" + messageid, conn);
            SqlDataReader dr = command.ExecuteReader();
            if (dr.Read())
            {
                context.Response.BinaryWrite((Byte[])dr[0]);
                conn.Close();
                context.Response.End();
            }
            else
            {
                context.Response.ContentType = "image/gif";
                context.Response.Buffer = false;
                context.Response.OutputStream.Write(GifData, 0, GifData.Length);
            }
        }
        catch (Exception ex)
        {
            return;
        }
    }

我确实更新了Win给出的答案。唯一的问题是网格视图确实具有每行在白色和灰色之间交替颜色的样式。因此,如果没有图像,则会显示一个白色框,并且位于灰色行中。

当不存在图像时,在网格视图中隐藏图像控件

如果没有可用的图像,则可以呈现透明图像表单图像处理程序。

这是示例 -

// 1x1 transparent GIF
private readonly byte[] GifData =
{
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};
public void ProcessRequest(HttpContext context)
{
    try
    {
        ...
    }
    catch (Exception ex)
    {
        context.Response.ContentType = "image/gif";
        context.Response.Buffer = false;
        context.Response.OutputStream.Write(GifData, 0, GifData.Length);
    }
}

对于以前链接到的解决方案,请尝试将图像控件的 Enabled 属性设置为"false"。

图像启用属性

好的,所以我想出了一个解决方案。我只将单个图像保存到表中。在插入时,它要么插入图像,要么插入"NULL"(如果未插入图像)。然后,我检查表是否具有空图像,如果有,则禁用图像控件。我将以下内容放在Page_Load中。

C# 代码隐藏

if (Page.IsPostBack || !Page.IsPostBack)
            {
                foreach (GridViewRow allrows in gvPosts.Rows)
                {
                    string messageid = ((Label)allrows.FindControl("lblMessageID")).Text;
                    Image image = ((Image)allrows.FindControl("postImage"));
                conn.Open();
                SqlCommand checkNullImage = new SqlCommand("SELECT Image FROM BlogMessages WHERE MessageID=" + messageid, conn);
                nullImage = Convert.ToString(checkNullImage.ExecuteScalar());
                if (nullImage == DBNull.Value.ToString())
                {
                    image.Visible = false;
                }
                conn.Close();
            }

这是最好的方法吗?我不确定,但它有效,并且由于我一次只显示 10 个帖子,因此它工作速度很快。