页面Page_Load事件与中继器ItemCommand

我正在Page_Load中运行一些代码,然后我将这段代码的结果存储在一些局部变量中。页面Page_Load事件与中继器ItemCommand

现在我用这个局部变量将它们分配到控制我的repeater项目模板

问题是>>页面不显示的项目模板,但没有必然it..I数据里面思考中继器无法加载分配给它的数据在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();

}

EDIT 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)

回答:

你不应该在手动DataReader的迭代都没有。这是一个只有前瞻性的工具。只有中继器您的while循环可能会遍历结果。我相信你的直接问题是你的while循环在Repeater呈现之前耗尽DataReader。

当您拨打DataBind()时,您正在指示中继器为您指定为其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());

}

通过使用数据表,而不是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());

以上是 页面Page_Load事件与中继器ItemCommand 的全部内容, 来源链接: utcz.com/qa/262796.html

回到顶部