2012-04-24 18 views
2

を入力する私は、現在の編集行のためのdataTableから値を取得するためにRowDataBoundイベントにしようとしている: はここに私のコードです:RowDataBound:dataTableから値を取得する!型のオブジェクトをキャストできません「System.DBNull」「可能System.String」

string KK = (string)DataBinder.Eval(e.Row.DataItem, "Name"); 
if (KK == "John") 
{ 
//execute code 
} 

エラー: 'System.String'型に 'System.DBNull'型のオブジェクトをキャストすることができません。最初の行(文字列KKを持つもの)

どうすれば修正できますか?

答えて

12

使用DataItem

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState == DataControlRowState.Edit)) 
    { 
     DataRow row = ((DataRowView)e.Row.DataItem).Row; 
     String name = row.Field<String>("Name"); 
     // String is a reference type, so you just need to compare with null 
     if(name != null){/* do something */} 
    } 
} 

Field extension methodもNULL可能タイプをサポートしています。 DBNull.Valueのため

0

ヌル値を取得しようとする前に、ヌル値を正しくチェックするには、「IsNull」メソッドを使用する必要があります。基本となるデータソースを取得するGridViewRow代わりのDataBinder.Eval

+0

これは、ユーザーが編集できないため、列セルの値が決して空にならないことです。 –

1

チェックしていないDBNull.Valueを

1

がDBNull値は値がないことを示して DB、にNULL値であることを示している場合、あなたのデータを取得します。 に照会が有効なデータを戻しているかどうか確認することができます。そうである場合は、リスト内の項目がnullの場合に使用する値 を見つける必要があります。

これを試してみてください:

string KK = DataBinder.Eval(e.Row.DataItem, "Name").GetType() == typeof(System.DBNull) ? "" : (string)DataBinder.Eval(e.Row.DataItem, "Name") 
0

あなたはDataRowをつかむと、そのオフ動作するはずです:

var row = e.Row.DataItem as DataRow; 
if (row != null) 
{ 
    //for strings this will work fine 
    var name = row.Field<string>("Name"); 

    //for other types use the IsNull function to check for DBNull 
    if (!row.IsNull("SomeDecimalValue")) 
     var value = row.Field<decimal>("SomeDecimalValue"); 
} 

EDIT別のオプションは、値そのチャンスがあるとき、NULL可能タイプを使用することですnullまたはDBNull

var value = row.Field<decimal?>("SomeDecimalValue"); 
if (value.HasValue) 
{ 

} 
関連する問題