2012-01-11 25 views
0

は、私は自分のミス発見してきた質問の編集ではなぜAsp.Net GridViewのためのRowDataBoundコールバック内のDataRow [ "columnValue"]ヌル

更新です(stringに不正なキャストを。)

多くすべてのおかげで、すべての提案が最も役立ちました。

元の質問

私はDataTableを含むDataSetで満たされているObjectDataSourceから.aspxGridViewのページ、データバインドされています。

GridViewRowDataBoundコールバックを処理する場合、基になるデータセットの列を列名で参照することはできませんが、タイプが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> 
+0

あなたは、列名は日付だけでなく、フィールド名であることを確認しましたか? –

答えて

1

考慮すべきいくつかあります。

  1. e.Row.Cellsは、オブジェクト自体ではなく、書式付きの出力を参照しています。
  2. 空白でない空白としてレンダリングされるため、&nbsp;
  3. の列名は大文字です。 "Date"!= "date"
  4. 列名は、値の型が文字列ではなくDateTimeオブジェクトであることを意味します。したがって、DateTimeからstringに柔軟にキャストすると、DateTimeオブジェクトの文字列値ではなくnullが返されます。

代わりにしてみてください。この

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

1.わかりましたが、これは私が修正する必要がある既存のコードでした。私はこれが事実だと思った。私もこれを疑っていましたが、このケースは正しいです( 'row.Table.Columns [" date "]'の成功によって実証されたように)4.私はこれを訂正しました(本当に下の 'DateTime'です。同じ問題(質問は更新されました) – xan

+0

SQLステートメントとデータベーススキーマはどうですか?データベースはnull値を許可していますか?この時点でUIは問題を提示しません。 –

関連する問題