2011-05-03 55 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