如何在asp.net中配置datalist的索引?

时间:2015-12-02 09:46:56

标签: c# asp.net visual-studio datalist

我在visual studio中开发了一个Web应用程序,它在一个页面中显示数据库中的房间图片及其名称,并在数据列表中显示每个房间旁边的费率按钮

然后当用户点击费率按钮时,房间图片及其名称应该转移到费率页面,但是,

如果我点击任何按钮,只显示费率页面中显示的第一个房间图片和名称:'(

我认为它与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();

            }



        }
    }
}

3 个答案:

答案 0 :(得分:2)

您正在foreach重定向,您知道Response.Redirect会立即将客户端重定向到新的网址,并在完成后抛出ThreadAbortException吗?

相反,您只需要在当前项目上使用FindControl而不是全部(实际上只是第一项,因为foreach未完全枚举),它是按钮的{ {1}}:

NamingContainer

正如Rahul在评论部分中所提到的那样,你不应该在每个帖子上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"); } DataBind,而只是在最初的帖子上。因此,请使用DataList进行检查:

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 - 语句和局部变量用于连接而不是字段也是一种好习惯。这确保即使出错也会关闭。

答案 1 :(得分:0)

为什么不尝试使用DataList_ItemCommand事件重定向到另一个页面以查找相应的项目。

以下是我建议您尝试的内容:

  1. 使用Command Argument代替LinkButton将每个会议室的PrimaryKey Id存储到Button属性中。
  2. 在后面的代码中,创建DataList_ItemCommand事件并获取被点击的项目的命令参数:

    var id = e.CommandArgument;

  3. 在同一个函数中使用Response.Redirect并将此ID作为查询字符串参数传递,或者像现在一样在Session中传递,并在重定向页面上获取它。

  4. 您还可以从此链接获取DataList_ItemCommand事件的参考:Pass Data to other Page using DataList and Querystring

    希望这有帮助。

答案 2 :(得分:0)

输入Button Control的CommandName和CommandArgument属性。将记录的主键放在CommandArgument中,而不是使用按钮的单击事件。使用按钮的命令事件。在那种情况下,您将获得CommandEventArgs类型的参数。在这种情况下,您可以使用CommandEventArgs参数&#34; CommandArgument&#34;来获取正在评估记录的主键。财产,然后你可以用这个特殊记录做任何你想做的事。