Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不存在图像时在Gridview中隐藏图像控件_C#_Asp.net_Image_Gridview - Fatal编程技术网

C# 不存在图像时在Gridview中隐藏图像控件

C# 不存在图像时在Gridview中隐藏图像控件,c#,asp.net,image,gridview,C#,Asp.net,Image,Gridview,我有一个问题开始让我感到沮丧。我使用GridView创建了一个非常简单的博客。我还被要求能够上传图片到帖子上。我遇到的问题是,如果用户创建了一个没有图片的帖子,那么图像控件无论如何都会显示红色的x。我尝试了很多事情,但都没有成功。我正在使用自定义处理程序获取帖子的图像 ImageHandler.ashx SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dboBlog"].Conn

我有一个问题开始让我感到沮丧。我使用GridView创建了一个非常简单的博客。我还被要求能够上传图片到帖子上。我遇到的问题是,如果用户创建了一个没有图片的帖子,那么图像控件无论如何都会显示红色的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;
        }
    }
// 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;
        }
    }
我有一个与Post表相关的Images表。如您所见,它使用QueryString并检索MessageID或Posts id,然后显示图像

这是我目前在Posts.aspx中用于图像控件的内容

ASP

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

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

如果没有可用的图像,可以从图像处理程序渲染透明图像

这是样本-

// 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”


好的,我想出了一个解决办法。我只将一个图像保存到表中。在insert上,它要么插入图像,要么在未插入图像时插入“NULL”。然后检查表是否有空图像,如果有,则禁用图像控件。我在页面加载中放置以下内容

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个帖子,它工作得很快

这个效果很好。唯一的问题是在gridview中,行是交替的。白,灰,白,灰。因此,当添加一篇新文章时,一个白色的正方形显示为灰色。使用前面提到的解决方案,您是否尝试过将图像控件上的“Enabled”属性设置为false?我以前也研究过,但我认为只有启用主题和启用视图状态才是唯一的启用选项。是的,我已经把它作为一个答案发布了。我想这可能对你有用……我无法让这个解决方案起作用。我得到一个“ProjectName.ClassName.Enabled”:找不到合适的方法重写@[BrowsableAttribute(false)]公共重写bool Enabled{get;set;}图像控件是否在某种容器中?如果是,并且要在代码中设置Enabled属性,请尝试使用FindControl()方法。很难说不知道如何设置Enabled属性。。。