#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. Я предложил ему добавить переменную-член для достижения этой цели. Если переменная, объявленная в классе, не помогает выполнить это.