2015-12-02 3 views
1

Я разрабатываю веб-приложение в визуальной студии, которое отображает фотографии номеров и их имена из базы данных на одной странице, и кнопку скорости рядом с каждой комнатой. Все в дате.Как настроить индекс datalist в asp.net?

Затем, когда пользователь нажимает кнопку курса, изображение комнаты и его имя должно быть передано на страницу курса, но,

что происходит со мной в том, что если я нажимаю на любую кнопку только первое изображение комнаты и имя, отображаемое на странице курса: '(

Я думаю, что это соответствует с индексом datalist, но я не знаю, как с этим справиться !!

Что мне делать, чтобы исправить это?

Вот код

webform1.aspex

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="HotelG.WebForm1" EnableEventValidation="false" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:DataList ID="DataList1" runat="server" Width="615px" Height="439px" > 
      <ItemTemplate> 
       <table> 
        <tr> 

         <td><asp:Image ID="Img1" runat="server" ImageUrl=<%# Eval("Picture")%> Height="100" style="position: relative; top: 0px; left: 98px; width: 100" /> </td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
          <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 

         <asp:Label ID="Label1" runat="server" Text=<%# Eval("Room_Type")%>></asp:Label> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td></td> 
         <td><asp:Button ID="btn1" runat="server" Text="Rate" OnClick="Button1_Click" /></td> 
        </tr> 
       </table> 
      </ItemTemplate> 
     </asp:DataList> 

     <br /> 

    </div> 
    </form> 
</body> 
</html> 

WebForm1 файл кода

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Data.SqlClient; 

namespace HotelG 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     SqlConnection con = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=C:\Users\user\Desktop\database\Golden_Rose.mdf;Integrated Security = True; Connect Timeout = 30"); 
     protected void Page_Load(object sender, EventArgs e) 
     { 

      con.Open(); 
      string sel = "select Room_Type , Picture from room_details"; 
      SqlCommand cmd = new SqlCommand(sel, con); 

      DataTable dt = new DataTable(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 

      da.Fill(dt); 
      DataList1.DataSource = dt; 
      DataList1.DataBind(); 
      con.Close(); 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 


      foreach (DataListItem li in DataList1.Items) 
      { 

       Image img = (Image)li.FindControl("Img1"); 
       Label lbl = (Label)li.FindControl("Label1"); 
       string labeltext = lbl.Text; 
       string url = img.ImageUrl; 
       Session["type"] = labeltext; 
       Session["img"] = url; 
       Response.Redirect("WebForm2.aspx"); 



      } 





     } 




    } 
} 

webform2 файл кода

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace HotelG 
{ 
    public partial class WebForm2 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

      if (Session["type"] != null) 
      { 
       Label1.Text = Session["type"].ToString(); 

       Label5.Text = Session["type"].ToString(); 

      } 
      if (Session["img"] != null) 
      { 
       Image1.ImageUrl = Session["img"].ToString(); 

       Label4.Text = Session["img"].ToString(); 

      } 



     } 
    } 
} 
+0

@TimSchmelter правильный. Кроме того, вы не должны привязывать 'DataList' к каждой загрузке страницы. Рассмотрите возможность связывания его внутри '! IsPostBack'. –

+1

@RahulSingh: упомянул об этом в моем ответе. Спасибо –

ответ

2

Вы перенаправляют в a foreach, вы знаете, что Response.Redirect немедленно перенаправляет клиента на новый URL-адрес и выдает ThreadAbortException по завершении?

Вместо этого вам нужно всего лишь использовать FindControl на текущего пункта, а не все (на самом деле только первый, потому что foreach не полностью перечисляемого), это кнопки он NamingContainer:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    DataListItem currentItem = (DataListItem)((Button) sender).NamingContainer; 
    Image img = (Image)currentItem.FindControl("Img1"); 
    Label lbl = (Label)currentItem.FindControl("Label1"); 
    string labeltext = lbl.Text; 
    string url = img.ImageUrl; 
    Session["type"] = labeltext; 
    Session["img"] = url; 
    Response.Redirect("WebForm2.aspx"); 
} 

Как отметил Рахул в разделе комментариев вы также не должны DataBindDataList на каждое сообщение, но только на начальном. Поэтому использовать IsPostBack, чтобы проверить его:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     con.Open(); 
     string sel = "select Room_Type , Picture from room_details"; 
     SqlCommand cmd = new SqlCommand(sel, con); 

     DataTable dt = new DataTable(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 

     da.Fill(dt); 
     DataList1.DataSource = dt; 
     DataList1.DataBind(); 
     con.Close(); 
    } 
} 

В противном случае все изменения будут потеряны, и события не срабатывает. Это применяется только в том случае, если включено значение ViewState, которое по умолчанию. Также неплохо использовать значение using -statement и локальную переменную для соединения вместо поля. Это гарантирует, что он будет закрыт даже при ошибке.

+0

Я пробовал ваше решение, но это дало мне эту ошибку в этой строке DataListItem currentItem = ((Button) отправитель) .NamingContainer; Ошибка \t CS0266 \t Невозможно неявно преобразовать тип 'System.Web.UI.Control' в 'System.Web.UI.WebControls.DataListItem'. –

+0

Thaaaaaaaaaanks alot хорошо работает сейчас, большое спасибо вам, bro: ') .. –

0

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

Вот что я предлагаю вам следует попробовать:

  1. магазин PrimaryKey Id каждой комнаты в Command Argument собственности с помощью LinkButton вместо Button.
  2. В коде позади, создать DataList_ItemCommand события и приведите аргумент команды элемента, который щелкнул, как это:

    var id = e.CommandArgument;

  3. Использование Response.Redirect в той же функции и передать этот идентификатор в качестве запроса string или в сеансе, как вы делаете сейчас, и извлекаете его на странице перенаправления.

Вы также можете принять некоторые ссылки на DataList_ItemCommand мероприятия по этой ссылке: Pass Data to other Page using DataList and Querystring

Надеется, что это помогает.

0

Поместите в CommandName и CommandArgument свойства Button Control. Поместите первичный ключ записи в CommandArgument и вместо использования события нажатия кнопки. Используйте командное событие кнопки. В этом случае вы получите аргумент типа CommandEventArgs. И в этом случае вы можете получить первичный ключ записи, оцениваемой с помощью аргументов CommandEventArgs «Свойство CommandArgument», а затем вы можете делать все, что захотите, с помощью этой конкретной записи.