我在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();
我最初的问题
答案 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());