为什么DataRow [“columnValue”]在Asp.Net GridView的RowDataBound回调中为null

时间:2012-01-11 14:30:06

标签: asp.net data-binding gridview datatable aspxgridview

更新

在编辑问题时,我发现了自己的错误(无法转换为string。)

非常感谢所有人,所有建议最有帮助。

原始问题

我有.aspx页面,GridView,数据绑定到ObjectDataSource,其中包含DataSet,其中包含DataTable

但是,当处理RowDataBound上的GridView回调时,我无法按列名引用基础数据集中的列,它们只返回DBNull类型的对象。所以:

    protected void accountsGV_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // One way:
            // This works, but uses a hard coded column index which
            // I want to replace.
            if (e.Row.Cells[11].Text != " ")
            {
                // Apply certain styles to the row depending on
                // the contents of the cell.
            }


            // Another way. This doesn't work - "date" is always DBNull.
            DataRow row = (e.Row.DataItem as DataRowView).Row;
            DateTime date;

            if(!Convert.IsDBNull(row["date"]))
            {
                date = (DateTime)row["date"]);

                if (date < SomeConstantDate)
                {
                    // Apply certain styles to the row depending on
                    // the contents of the cell.
                }
            }
        }
    }

具体而言:

  • row["date"]返回DBNull类型的对象。
  • row[11]会返回DateTime
  • row.Table.Columns["date"]会返回有效的DataColumn
  • row[row.Table.Columns["date"]]返回DBNull类型的对象。

有人能说明为什么会这样吗?

设置

<asp:GridView ID="GV" runat="server" DataSourceID="ODS"
    AutoGenerateColumns="false"
    ... snip ...
    onrowdatabound="GV_RowDataBound" >
    <Columns> ... </Columns>
 </asp:GridView>


 <asp:ObjectDataSource ID="ODS" runat="server" 
    SelectMethod="getData"
    ... snip ...
</asp:ObjectDataSource>

1 个答案:

答案 0 :(得分:1)

有几点需要考虑。

  1. e.Row.Cells指的是格式化输出,而不是对象本身。
  2. 空值呈现为非消隐空格,因此&nbsp;
  3. 列名称具有案例敏感性。 “日期”!=“日期”
  4. 列名称暗示值的类型是DateTime对象,而不是字符串,因此从DateTime轻柔地转换为字符串将返回null,而不是DateTime对象的字符串值。
  5. 而不是试试这个

    var data = (DataRowView)e.Row.DataItem;
    var date = data["Date"];
    if(date != null and date.ToString() == "...")
    {
       do something based on the value of date.
    }