如何将GridView列绑定到列表?

时间:2013-03-07 12:45:47

标签: c# asp.net sql gridview

我有一个名为dayList的List,里面有12个日期。我试图将此列表绑定到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 Column与DataTable绑定一样?

3 个答案:

答案 0 :(得分:1)

正如@ manish-mishra所说,你为什么要这样做呢?只需拥有以下内容即可:

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

如果要设置lblgriddate控件的文本,则应将其设置为绑定到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]);
        }

答案 1 :(得分:0)

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

为什么要尝试绑定gridView的单个列?

你应该做以下两种情况之一:

  1. 直接将gridViewdayList绑定,即

     GridView2.AutoGenerateColumns=true;
     GridView2.DataSource = dayList;
     GridView2.DataBind();
    
  2. 将GridView绑定到至少包含12行的备用DataSource,以便GridView确实有行,然后在RowDataBound或之后(dataBinding)更新其中的一列Grid)包含来自DayList的值,即

    for (int i = 0; i < dayList.Count; i++)
    { 
        Label lbldate = (Label)GridView2.Rows[i].FindControl("lblgriddate");
        lbldate.Text = Convert.ToString(dayList[i]);
    }
    
  3. 在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];
    
            }
        }
    

    它应该给你一个想法:

    您也可以将DayList集合转换为GridViewRow集合,并将其添加到Controls的{​​{1}}。见ref

答案 2 :(得分:0)

创建一个新的DataGridViewRow对象,然后将列表中的项目添加到行。执行此操作后,将此行添加到gridview。这将做你正在尝试做的事情