2011-05-03 52 views
2

我遇到了这个网格视图的问题。我用查询填充它。但是,如果我使用一段时间(reader.Read())结构,它将不会填充或出现。没有while结构,它工作正常。但是,我需要访问两个特定的字段。代码如下。使用While()结构时,不会填充Gridview。 C#ASP.Net

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(); 
    } 
} 
+0

你在SQL语句中选择2组以上的列? – Chad 2011-05-03 17:19:41

回答

4

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>在示例)之前,我建议你do some reading on the subject

+1

@Nick删除你最初的'while'块,当你调用'DataBind'时,数据读取器将被枚举# – 2011-05-03 13:16:49

+0

我对c#很新颖。你是什​​么意思的强类型列表。你能告诉我一个你正在讲话的过程的例子吗? – Nick 2011-05-03 13:21:57

+0

@Nick编辑帖子以包含一个简单的例子。通过强类型列表,我的意思是“适当类型的通用列表”。 – 2011-05-03 13:34:30

1

创建一个类具有两个属性 1. decTicketCost 2. intTicketCount

现在while循环创建实例,并将值分配给对象属性

,并在列表中添加它。

最后绑定列表。

0

您可以取代

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

到 grdEvents.DataSource = myReader;
grdEvents.DataBind();

然后在GridView的一些值

希望这有助于

1

我的客人,您已设置的数据源myList代替myReader

grdEvents.DataSource = myList; 

编辑:您需要添加其他列你的列表对象。

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"]) }); 
} 
+0

如果我这样做,我的gridview将只填充票数量和票证成本。正如我所说,我需要整排放在桌子上。 – Nick 2011-05-03 15:02:49

+0

我很困惑。如何添加另一列帮助? – Nick 2011-05-03 15:10:13

+0

以非常相同的方式,因为您在列表中添加2列。 – 2011-05-03 15:12:09

0

grdEvents.DataSource = myList; 
+0

如果我这样做,我的gridview将只填充票数量和票证成本。正如我所说,我需要整排放在桌子上。 – Nick 2011-05-03 14:54:47

+0

您应该让该类具有所需数量的成员变量才能实现它。 – Pankaj 2011-05-03 15:06:27

0

这个怎么样替换下面的行

grdEvents.DataSource = myReader; 

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"]) }); 
+0

我建议他添加成员变量来实现它。如果在课堂上声明的变量没有帮助完成它。 – Pankaj 2011-05-03 15:43:26