2013-03-07 83 views
0

我有一个名为dayList的列表,其中有12个日期。我想把这个列表绑定到一个GridView列。如何将GridView列绑定到列表?

GridView2.DataSource = dayList; 

     GridView2.DataBind(); 

     for (int i = 0; i < dayList.Count; i++) 
     { 
      Label lbldate = (Label)GridView2.Rows[i].FindControl("lblgriddate"); 
      lbldate.Text = Convert.ToString(dayList[i]); 
     } 
    } 

我越来越对象引用未设置为一个对象错误的实例:

lbldate.Text = Convert.ToString(dayList[i]);

是因为有在GridView没有行?但不应该GridView自动添加行,就像我们绑定GridView列与DataTable一样?

回答

0

您正试图访问那些甚至不存在的GridView行。

你为什么要绑定一个gridView的单列?

你应该做这两种的:

  1. 直接绑定您的gridViewdayList

    GridView2.AutoGenerateColumns=true; 
    GridView2.DataSource = dayList; 
    GridView2.DataBind(); 
    
  2. 绑定你的GridView的备用数据源有ATLEAST的12行,使你的GridView确实有行,然后使用你的DayList中的值更新其中的一列RowDataBound或紧接着(dataBinding你的Grid),即

    for (int i = 0; i < dayList.Count; i++) 
    { 
        Label lbldate = (Label)GridView2.Rows[i].FindControl("lblgriddate"); 
        lbldate.Text = Convert.ToString(dayList[i]); 
    } 
    

内的RowDataBound

protected void Review_grid_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      e.Row.Cells[2].Text = DayList[e.Row.RowIndex]; 

     } 
    } 

它应该给你一个想法:

你也可以隐蔽您的收藏DayListGridViewRow收集,并将其添加到GridViewControls。见ref

+0

我可以根据列表中的元素数量动态地添加行到网格?因为列表中元素的数量可能会有所不同。 – Arbaaz 2013-03-07 13:02:22

+1

不,您不能直接将行添加到GridView。你可以创建一个DataTable并将行添加到迭代列表中,然后将该DataTable绑定到GridView。但是在那种情况下,为什么不直接绑定你的DayList到GridView ??。你可以控制headerText,格式化和什么不是 – 2013-03-07 13:05:28

+0

对! “创建一个DataTable并将行添加到迭代列表中,然后将该DataTable绑定到GridView。”挽救了一天。 – Arbaaz 2013-03-08 11:06:14

1

正如@ manish-mishra所说,你为什么要这么做?只要有以下就足够了:如果你想设置你的lblgriddate控件的文本

GridView2.DataSource = dayList; 
GridView2.DataBind(); 

,你应该把它绑定到你的rowtemplate的DataItem

 var dayList = new List<DateTime>() { 
      DateTime.Today, 
      DateTime.Today.AddDays(-1), 
      DateTime.Today.AddDays(-2) 
     }; 
     GridView2.DataSource = dayList; 
     GridView2.DataBind(); 

而对于HTML:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false"> 
     <Columns> 
      <asp:TemplateField HeaderText="Date"> 
       <ItemTemplate> 
        <asp:Label ID="lblgriddate" Text="<%# Container.DataItem %>" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

我加入以下代码DataBind()电话后,这也适用。尽管如此,它并没有改变。由于标签本身已经是数据绑定的值,因此您不必在代码中明确地绑定它。

 for (int i = 0; i < dayList.Count; i++) 
     { 
      Label lbldate = (Label)GridView2.Rows[i].FindControl("lblgriddate"); 
      lbldate.Text = Convert.ToString(dayList[i]); 
     } 
+0

关于'它不是GridView行的子节点,它是特定单元格的子节点,'......没有Willem,他得到这个错误是因为没有行,如果有足够的行数,那就是代码他将不得不写信给查找控制。 – 2013-03-07 13:09:35

+0

我站在FindControl位纠正,我刚做了一个示例应用程序来测试,它确实找到了标签控件。但是它也表明for-loop也可以工作。 – 2013-03-07 13:16:20

0

创建一个新的DataGridViewRow对象abd,然后将您的项目从您的列表添加到行。完成后将这一行添加到您的gridview。这将做你正在尝试做什么