Gridview не заполняется при использовании структуры While(). C # ASP.Net

#c# #asp.net #generics #data-binding

#c# #asp.net #gridview #sqldatareader

Вопрос:

У меня возникли проблемы с этим представлением сетки. Я заполняю его запросом. Однако он не будет заполняться или даже отображаться, если я использую структуру while (reader.Read()). Без структуры while это работает нормально. Однако мне нужно получить доступ к двум конкретным полям. Код приведен ниже.

  SqlDataReader myReader;
 try
 {
     using (myConnection)
     {
         myConnection.Open();
         ArrayList arrliGames = new ArrayList();
         myReader = myCommand.ExecuteReader();

         decimal decTicketCost = 0;
         int intTicketCount = 0;

         while (myReader.Read ())
         {
             decTicketCost = Convert .ToDecimal (myReader ["TicketCost"]);
             intTicketCount =Convert .ToInt32 (myReader ["NumTickets"]);
         }

         //Binds listbox
         grdEvents.DataSource = myReader ;
         grdEvents.DataBind();
     }
 }
  

Комментарии:

1. Вы выбираете более 2 столбцов в своем sql-операторе?

Ответ №1:

SqlDataReader Доступно только для пересылки. При первом переборе строк в нем «ничего не осталось» для последующего отображения.

Я предлагаю вам использовать программу чтения для заполнения строго типизированного списка в памяти, а затем привязать GridView к списку вместо этого. Пример:

 var myList = new List<TicketInfo>();
while (myReader.Read())
{
    myList.Add(new TicketInfo
    {
        TicketCost = Convert.ToDecimal(myReader["TicketCost"]),
        NumTickets = Convert.ToInt32(myReader["NumTickets"])
    });
}
grdEvents.DataSource = myList;
grdEvents.DataBind();
  

Приведенный выше пример кода предполагает, что у вас есть класс с именем, TicketInfo определенный как:

 class TicketInfo
{
    public decimal TicketCost { get; set; }
    public int NumTickets { get; set; }
}
  

Если вы раньше не использовали обобщения (такие, как List<TicketInfo> в примере), я предлагаю вам немного почитать по этому вопросу.

Комментарии:

1. @Nick удалите ваш начальный while блок, считыватель данных будет перечислен при вызове DataBind

2. Я довольно новичок в c #. Что вы подразумеваете под строго типизированным списком. Не могли бы вы показать мне пример процесса, о котором вы говорите?

3. @Nick отредактировал сообщение, включив простой пример. Под строго типизированным списком я действительно имел в виду «общий список соответствующего типа».

4. Что позволяет мне использовать List<>? Моя среда разработки продолжает говорить, что она не может быть найдена

5. @Nick Добавить » с использованием системы. Коллекции. Общий » в начало вашего файла.

Ответ №2:

создайте класс с двумя свойствами 1. decTicketCost 2. intTicketCount

теперь в цикле while создайте экземпляр и присвоите значение свойствам объекта

и добавьте его в список.

Наконец, свяжите список.

Ответ №3:

Я надеюсь, что вместо этого вы установили datasource в myList myReader

 grdEvents.DataSource = myList;
  

Редактировать: Вам нужно добавить другой столбец в ваш объект list.

 while (myReader .Read ())
{
//myList-- Add other columns you need to display in the gridview
//As I don't know the your Data Reader column, I can't give you exact mylist object

 myList.Add(new TicketInfo{TicketCost = Convert.ToDecimal(myReader["TicketCost"]),NumTickets = Convert.ToInt32(myReader["NumTickets"])  });
}
  

Комментарии:

1. Если я это сделаю, мой gridview будет заполнен только суммой билета и стоимостью билета. Как я уже сказал, мне нужно, чтобы в таблице присутствовала вся строка.

2. Я очень смущен. Как поможет добавление другого столбца?

3. почти таким же образом, как вы добавляете 2 столбца в свой список.

Ответ №4:

Вы могли бы заменить

 while (myReader .Read ())                        
{                             
decTicketCost  = Convert .ToDecimal (myReader ["TicketCost"]);                            intTicketCount = Convert .ToInt32 (myReader ["NumTickets"]);                             
}                              
//Binds listbox                         
grdEvents.DataSource = myReader ;                         
grdEvents.DataBind();  
  

для
grdEvents.Источник данных = myReader ;

grdEvents.DataBind();

А затем gridview для некоторых значений

надеюсь, это поможет

Ответ №5:

замените следующую строку

 grdEvents.DataSource = myReader;
  

с помощью

 grdEvents.DataSource = myList;
  

Комментарии:

1. Если я это сделаю, мой gridview будет заполнен только суммой билета и стоимостью билета. Как я уже сказал, мне нужно, чтобы в таблице присутствовала вся строка.

2. Для достижения этого у вас должен быть класс, имеющий необходимое количество переменных-членов.

Ответ №6:

Как насчет этого:

 using (myConnection)
{
   myConnection.Open();
   DataSet ds = myCommand.ExecuteDataSet();

   //Binds listbox
   grdEvents.DataSource = ds;
   grdEvents.DataBind();                    
}
ForEach (DataRow dr in ds.tables[0].rows)
    myList.Add(new TicketInfo{TicketCost = Convert.ToDecimal(myReader["TicketCost"]),NumTickets = Convert.ToInt32(myReader["NumTickets"])  });  
  

Комментарии:

1. Я предложил ему добавить переменную-член для достижения этой цели. Если переменная, объявленная в классе, не помогает выполнить это.