Page Page_Load事件与Repeater ItemCommand

时间:2010-12-12 03:04:19

标签: c# asp.net sql

我在Page_Load中运行了一些代码,然后将此代码的结果存储在一些局部变量中。

现在我使用这个局部变量将它们分配给我的转发器项目模板

中的控件

问题是>>页面没有显示项目模板,但没有绑定到它的数据..我认为转发器无法加载在Page_Load中分配给它的数据,并且它得到了初始化 - 生命周期相关的问题 -

知道问题究竟是什么?以及如何解决这个问题?

修改

一些示例代码:

public partial class MyPage: System.Web.UI.Page
    {

        int UserId = 0;

        protected void Page_Load(object sender, EventArgs e)
        {

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString);

            SqlCommand comm = new SqlCommand("SELECT * From Users, conn);
            SqlDataReader reader;

            conn.Open();
            reader = comm.ExecuteReader();

//I'm not sure if I need those two lines:
            AllBrandsRptr.DataSource = reader;
            AllBrandsRptr.DataBind();

            while (reader.Read())
            {

                    UserId = (int)reader["UserId"];
            }
                conn.Close();

            }
        }


    protected void AllBrandsRptr_ItemCommand(object source, RepeaterCommandEventArgs e)
    {

        Label LabelTest = (Label)e.Item.FindControl("MyTestLabel");
        LabelTest.Text = UserId.ToString();

    }

编辑2

  

我的Sql SELECT语句

string command1 = "SELECT Brands.BrandId, Brands.BrandName, Brands.BrandLogo, Brands.BrandWebsite, Brands.IsBrandVisible, Cuisines.CuisineType, VenueTypes.VenueTypeName FROM         Brands FULL OUTER JOIN BrandCuisines ON BrandCuisines.BrandId = Brands.BrandId FULL OUTER JOIN Cuisines ON Cuisines.CuisineId = BrandCuisines.CuisineId FULL OUTER JOIN BrandVenueTypes ON BrandVenueTypes.BrandId = Brands.BrandId FULL OUTER JOIN VenueTypes ON VenueTypes.VenueTypeId = BrandVenueTypes.VenueTypeId";
  

我的过滤代码

            conn.Open();
            reader = comm.ExecuteReader();
            AllBrandsRptr.DataSource = reader;
            AllBrandsRptr.DataBind();

            while (reader.Read())
            {

                  if (((int)reader["BrandId"]) == BrandId) //this line to pass collecting some info, if I already iterated through the same Id 
                  {
                    BrandId = (int)reader["BrandId"];
                    BrandName = (string)reader["BrandName"];
                    BrandLogo = (string)reader["BrandLogo"];
                    BrandWebsite = (string)reader["BrandWebsite"];
                    IsVisible = (bool)reader["IsBrandVisible"];
                  }

                if (reader["CuisineType"] != DBNull.Value)
                {
                    Cuisines += (string)reader["CuisineType"];
                }

                if (reader["VenueTypeName"] != DBNull.Value)
                {
                    VenueTypes += ", " + (string)reader["VenueTypeName"];
                }

                conn.Close();
  

我最初的问题

How to use in my application a SELECT statement that must return more than one record to show multiple values for a certain field (m:m relation)

1 个答案:

答案 0 :(得分:1)

您根本不应手动迭代DataReader。这是一个只有前瞻性的工具。只有Repeater 你的while循环可能会遍历结果。我相信你的直接问题是你的while循环在Repeater渲染之前耗尽了DataReader。

当您致电DataBind()时,您正在指示Repeater为您指定为DataSource的集合中的每个项目呈现其模板。因此,任何过滤都需要在此之前进行。理想情况下,您应该将过滤逻辑作为where子句添加到SQL语句中。

你能更具体地解决你想要解决的真正问题吗?否则很难给你准确的建议。


<强>更新

请注意,while(reader.Read())不像事件处理程序那样工作,或者与语义声音的方式类似。换句话说,当读取DataReader时,您并没有告诉程序执行某些操作,而是告诉它立即开始读取数据(与Repeater无关)。

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

string sql = "Your current SQL here";
string connectionString = "Your connection string here";

// The using block ensures that the connection will be closed and freed up,
//  even if an unhandled exception occurs inside the block.
using (SqlConnection conn = new SqlConnection(connectionString))
{
  SqlCommand cmd = new SqlCommand(sql, conn);

  SqlDataAdapter da = new SqlDataAdapter(cmd);

  DataTable dt = new DataTable();

  da.Fill(dt);

  AllBrandsRptr.DataSource = dt;
  AllBrandsRptr.DataBind();

  var cuisineTypes = from row in dt.AsEnumerable()
                     select row["CuisineType"];

  string cuisines = string.Join(", ", cuisineTypes.Distinct());

  var venueTypes = from row in dt.AsEnumerable()
                   select row["VenueTypeName"];

  string venues = string.Join(", ", venueTypes.Distinct());
}

通过使用DataTable而不是DataReader,您可以根据需要多次迭代数据。 DataReader的性能更高,如果只需要通过数据进行单向前向读取,但DataTable功能更强大,并且在DataReader的功能之外的这些情况下非常有用。


值得一提的是,如果您长期关注此项目并希望使其可维护,您应该考虑最终将这些数据访问代码移动到单独的层。您应该努力在.aspx.cs文件中永远不要使用SQL语句或直接数据访问代码。

然后,您的Page_Load中的代码可以强类型化并且更易于使用:

List<Brand> brands = Brand.GetAllBrands();

AllBrandsRptr.DataSource = brands;
AllBrandsRptr.DataBind();

var cuisineTypes = from brand in brands
                   select brand.CuisineType;

string cuisines = string.join(", ", cuisineTypes.Distinct());

var venueTypes = from brand in brands
                 select brand.VenueType;

string venues = string.join(", ", venueTypes.Distinct());