Событие Page_Load страницы против элемента-повторителя ItemCommand - PullRequest
0 голосов
/ 12 декабря 2010

Я запускаю некоторый код в Page_Load, затем сохраняю результаты этого кода в некоторых локальных переменных.

Теперь я использую эти локальные переменные, чтобы назначить их элементам управления внутри шаблона элемента моего репитера

Проблема в том, что >> страница не отображает шаблон элемента, но нет привязанных к нему данных .. Я думаю, что ретранслятор не может загрузить данные, назначенные ему в Page_Load, и он получает инициализированный цикл -life, связанный сIssues-

Есть идеи, что именно проблема?и как это решить?

РЕДАКТИРОВАТЬ

Пример кода:

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

My Sql SELECT Statement

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();

Моя начальная проблема

Как использовать в моем приложении инструкцию SELECT, которая должна возвращать более одной записи, чтобы показать несколько значений для определенного поля (отношение m: m)

1 Ответ

1 голос
/ 12 декабря 2010

Вы вообще не должны вручную перебирать DataReader.Это инструмент только вперед.Только Repeater или вашего цикла while может выполнять итерацию результатов.Я полагаю, что вашей непосредственной проблемой является то, что ваш цикл while исчерпывает DataReader до того, как Repeater рендерится.

Когда вы вызываете DataBind(), вы указываете Repeater визуализировать его шаблон для каждого элемента в назначенной вами коллекции.как его DataSource.Таким образом, любая фильтрация должна была произойти раньше.В идеале, вам, вероятно, следует добавить эту логику фильтрации в качестве предложения where к вашему выражению SQL.

Можете ли вы быть более конкретным в отношении реальной проблемы, которую вы пытаетесь решить?В противном случае трудно дать вам точный совет.


Обновление:

Имейте в виду, что while(reader.Read()) не работает как обработчик событий или иным образом похож накак это может семантически звучать .Другими словами, вы не говорите программе что-то делать, когда читается DataReader, вы говорите ему немедленно начать чтение данных (не связанных с Repeater).

Вот что я вам предлагаюtry:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...