2016-10-13 50 views
0

重新设计一个应用程序从一系列与其他项目一起存储的图像显示到存储在第二个表格中的可变数量的图像。动态显示来自数据库的图像

发现了这个问题,并已开始从中修改,但我得到一个有点失落:ASP.Net Display Images in a GridView span across columns and rows? Using C#

我有建asp.net页面DataList控件,但知道路径的项目将无法正常工作:

<asp:DataList ID="dlImages" runat="server" 
    RepeatColumns ="2" 
    RepeatDirection ="Horizontal" 
    RepeatLayout ="Flow"> 

    <ItemTemplate> 
     <asp:Image ID="ImageQ" runat="server" Width="150px" ImageUrl='<%# Bind("ImageFile", "~/photo/{0}") %>' /> 
    </ItemTemplate> 
</asp:DataList> 

但是我失去了尝试将数据放入此列表中。 本来的图像数据被经由下面连同其它信息一起加载:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string sConstr = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; 
    SqlConnection Conn = new SqlConnection(sConstr); 

    using (Conn) 
    { 
     SqlCommand command = new SqlCommand("QuestionDetail", Conn); 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.Add(new SqlParameter("@QuestionID", SqlDbType.BigInt)); 
     command.Parameters["@QuestionID"].Value = Convert.ToInt32(Request["Id"]); 
     Conn.Open(); 
     SqlDataReader reader = command.ExecuteReader(); 

     while (reader.Read()) 
     { 
      byte[] imgBytes = (byte[])reader["ImageFile"]; 
      string encodedBytes = Convert.ToBase64String(imgBytes); 
      string url = string.Concat("data:image/jpg;base64,", encodedBytes); 
      Image1.ImageUrl = url; 

      byte[] imgBytes2 = (byte[])reader["ImageFile2"]; 
      string encodedBytes2 = Convert.ToBase64String(imgBytes2); 
      string url2 = string.Concat("data:image/jpg;base64,", encodedBytes2); 
      Image2.ImageUrl = url2; 

      byte[] imgBytes3 = (byte[])reader["ImageFile3"]; 
      string encodedBytes3 = Convert.ToBase64String(imgBytes3); 
      string url3 = string.Concat("data:image/jpg;base64,", encodedBytes3); 
      Image3.ImageUrl = url3; 

      byte[] imgBytes4 = (byte[])reader["ImageFile4"]; 
      string encodedBytes4 = Convert.ToBase64String(imgBytes4); 
      string url4 = string.Concat("data:image/jpg;base64,", encodedBytes4); 
      Image4.ImageUrl = url4; 

      txt_QuestionID.Text = reader["Id"].ToString(); 
      txt_author.Text = reader["Author"].ToString();    
      txt_Date.Text = reader["SubmitDate"].ToString();    
      txt_Stem.Text = reader["Stem"].ToString(); 

      txt_RespA.Text = reader["RespA"].ToString(); 
      txt_RespB.Text = reader["RespB"].ToString(); 
      txt_RespC.Text = reader["RespC"].ToString(); 
      txt_RespD.Text = reader["RespD"].ToString(); 
      txt_RespE.Text = reader["RespE"].ToString(); 

      txt_Answer.Text = reader["Answer"].ToString(); 
      txt_Critique.Text = reader["Critique"].ToString(); 
      txt_KeyObjective.Text = reader["KeyObjective"].ToString(); 

      txt_References.Text = reader["References"].ToString(); 
      txt_Practice1.Text = reader["PracticeArea1"].ToString(); 
      txt_Practice2.Text = reader["PracticeArea2"].ToString(); 
      txt_Practice3.Text = reader["PracticeArea3"].ToString(); 
      txt_Practice4.Text = reader["PracticeArea4"].ToString(); 

      txt_IsCloneOf.Text = reader["IsCloneOf"].ToString(); 
     } 

     reader.Close(); 
    } 
} 

我已拍摄的图像的部分出并正尝试经由单独的代码块,加工处理到DataList(并离开文本元素作为是)并且有一个存储过程将抓取适用的记录。

的页面加载基于连接到每个问题的图像数量是否正确加载占位符本节,,,但如何获得编码的图像读取,而不是传递路径.....:

DataTable dt = new DataTable(); 
       using (Conn) 
       { 
        SqlCommand ad = new SqlCommand("ImageDetail", Conn); 
        ad.CommandType = CommandType.StoredProcedure; 
        ad.Parameters.Add(new SqlParameter("@QuestionID", SqlDbType.BigInt)); 
        ad.Parameters["@QuestionID"].Value = Convert.ToInt32(Request["Id"]); 
        SqlDataReader reader2 = command.ExecuteReader(); 
        while (reader2.Read()) 
        { 
         if(!Convert.IsDBNull(reader2["ImageFile"])) 
         { 
         byte[] imgBytes = (byte[])reader2["ImageFile"]; 
         string encodedBytes = Convert.ToBase64String(imgBytes); 
         string url = string.Concat("data:image/jpg;base64,", encodedBytes); 
         } 
        } 
        reader2.Close(); 
        dt.Load(reader2); 
       } 
       dlImages.DataSource = dt; 
       dlImages.DataBind(); 

仍然是一个noob,每次我改变控制,我花了一段时间才弄清楚如何使用新的一个。现在代码将运行没有错误,,,但没有图像。我不得不添加检查“IsDBNULL”,因为我不断收到此错误。我知道由ImageDetail存储过程访问的表在任何记录中都有零空值,并且存储过程在提供QuestionID时返回记录。

+0

这是一个可行的答案。因此,比较你的代码,并按照步骤,你应该找到你在这里错过了什么http://stackoverflow.com/a/33694399/2946329 –

+0

@ S.Akbari我遇到的问题之一是,在两个你链接到的问题,以及我在我的问题中提到的问题是,两者都拉图像地址。我在数据库中编码了必须从编码数据中检索和显示的图像。我迷失了如何将我在原版应用程序中使用的读者整合到其他两个帖子的结构中。 –

+0

@ S.Akbari编辑问题以尝试使问题更清楚 –

回答

0

终于弄清楚了。

DataList控件:

<asp:DataList ID="dlImages" runat="server" 
RepeatColumns ="2" 
RepeatDirection ="Vertical" 
CellSpacing ="20" 
RepeatLayout ="Table"> 

<ItemTemplate> 
<asp:Image ID="Image1" runat="server" Height="200px" ImageUrl='<%# "GetImage.aspx?id=" + System.Convert.ToString(Eval("ImageID")) %>' /><br /> 
<asp:Label ID="Label1" runat="server" Text='<%# Eval("ImageName") %>' Font-Bold="True" Font-Size="1.2em" ForeColor="Navy"/><br /> 
<asp:Label ID="Label2" runat="server" Text='<%# Eval("ImageContent") %>' Font-Italic="true"/><br /> <br /> 
</ItemTemplate> 

用于填充数据表定义(注意数据源上的页面加载事件先前所定义):

DataTable dt = new DataTable(); 
       using (Conn) 
       { 
        SqlDataAdapter ad = new SqlDataAdapter("SELECT QuestionID, Images2.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from qimages join Images2 on qimages.imageid = images2.imageid where QuestionID = @QuestionID", Conn); 
        ad.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = txt_QuestionID.Text; 
        ad.Fill(dt); 
       } 
       dlImages.DataSource = dt; 
       dlImages.DataBind(); 

最后对于“的getImage的代码.aspx“页面检索并将图像传递给datalist。此页面只使用后面的代码:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      string sImageID = Request.QueryString["id"]; 

      string constr = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; 
      string sQuery = "SELECT ImageFile from Images2 WHERE ImageID = @ImageID"; 

      SqlConnection con = new SqlConnection(constr); 
      SqlCommand cmd = new SqlCommand(sQuery, con); 

      cmd.Parameters.Add("@ImageID", SqlDbType.Int).Value = Int32.Parse(sImageID); 

      using (con) 
      { 
       con.Open(); 
       SqlDataReader DR = cmd.ExecuteReader(); 

       if (DR.Read()) 
       { 
        byte[] imgData = (byte[])DR["ImageFile"]; 
        Response.BinaryWrite(imgData); 
       } 
      } 
     } 
    } 

这是工作,以显示基于问题的两列数据库编码图像被注视。

感谢大家指点。

相关问题