【问题标题】:Gridview not populating while using a While() structure. C# ASP.Net使用 While() 结构时未填充 Gridview。 C# ASP.NET
【发布时间】:2011-05-03 13:10:55
【问题描述】:

我在使用此网格视图时遇到问题。我正在用查询填充它。但是,如果我使用 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();
     }
 }

【问题讨论】:

  • 您在 sql 语句中选择的列是否超过 2 列?

标签: c# asp.net gridview sqldatareader


【解决方案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&lt;TicketInfo&gt;),我建议你do some reading on the subject

【讨论】:

  • @Nick 删除你最初的while 块,当你调用DataBind时会枚举数据读取器
  • 我对 c# 很陌生。强类型列表是什么意思。你能给我看一个你所说的过程的例子吗?
  • @Nick 编辑了帖子以包含一个简单的示例。我所说的强类型列表实际上是指“适当类型的通用列表”。
  • 什么允许我使用 List?我的 IDE 一直说找不到
  • @Nick 将“using System.Collections.Generic”添加到文件顶部。
【解决方案2】:

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

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

并将其添加到列表中。

最后绑定列表。

【讨论】:

    【解决方案3】:

    我来宾您已将数据源设置为 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"])  });
    }
    

    【讨论】:

    • 如果我这样做,我的 gridview 将仅由门票金额和门票费用填充。正如我所说,我需要整行都出现在桌子上。
    • 我很困惑。添加另一列有何帮助?
    • 以非常相似的方式,在列表中添加 2 列。
    【解决方案4】:

    你可以替换

    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

    希望有帮助

    【讨论】:

      【解决方案5】:

      替换下面一行

      grdEvents.DataSource = myReader;
      

      grdEvents.DataSource = myList;
      

      【讨论】:

      • 如果我这样做,我的 gridview 将仅由门票金额和门票费用填充。正如我所说,我需要整行都出现在桌子上。
      • 你应该让类具有所需数量的成员变量来实现它。
      【解决方案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"])  });  
      

      【讨论】:

      • 我建议他添加成员变量来实现。如果在类中声明的变量没有帮助完成它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多