2016-10-13 2 views
0

Редизайн приложения из заданного количества изображений, хранящихся в других элементах для отображения, на переменное количество изображений, хранящихся во второй таблице.Динамическое отображение изображений из базы данных

Найден этот вопрос и начало модифицирования от него, но я получаю немного потеряли: ASP.Net Display Images in a GridView span across columns and rows? Using C#

У меня есть DataList управления для asp.net страницы построена, но знает деталь пути не будет работать:

<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 через отдельный кодовый блок (и оставить текстовые элементы,) и иметь хранимую процедуру, которая будет захватывать соответствующие записи.

Этот раздел PageLoad загружает заполнители правильно на основе количества изображений, прикрепленных к каждому вопросу ,,, но как получить кодированное изображение прочитать вместо прохождения пути .....:

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 определение для заполнения (обратите внимание на источник данных, предварительно определен на события загрузки страницы):

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 "страница извлекает и передает изображение каталогу данных. Эта страница использует только код позади:

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); 
       } 
      } 
     } 
    } 

Это работает для отображения базы данных кодируются изображения в двух столбцах на основе вопроса быть рассмотрены.

Спасибо всем за указатели.

Смежные вопросы