2016-10-13 22 views
0

第2のテーブルに格納されている可変数の画像に、表示する他のアイテムとともに格納されている設定数の画像からアプリケーションを再設計します。 ASP.Net Display Images in a GridView span across columns and rows? Using C#データベースからの画像の動的表示

私が建て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私が問題を抱えている問題の1つは、あなたがリンクしている質問、私の質問で参照しているのは、両方とも画像アドレスを取得しているということです。私は、符号化されたデータから検索して表示する必要があるデータベース内の画像を符号化しています。私は元のアプリで使っているリーダーをどのように組み込み、それを他の2つの投稿のいずれかの構造に組み込む方法を失っています。 –

+0

@ S.Akbari問題をより明確にしようとする編集済みの質問 –

答えて

0

最後にこれを理解することができました。

データリストコントロール:

<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 "ページでデータを取得してデータリストに渡します。これは見されている問題に基づいて、2つの列のデータベースエンコードされた画像を表示するために取り組んでいる

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

:このページには、背後にあるコードのみ使用しています。

ありがとうございました。

関連する問題