- PR -

GridViewの列のNULL判定の方法について

1
投稿者投稿内容
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-08-15 12:27
VS2005で作成してます。

GirdView1にデータソースをバインドし、表示する前(GridView1.DataBoundイベントで)に、ある列の文字列項目がNULLの場合「データ未設定」のような表記に編集しGridViewを表示したいのですが、「&nbs/p;」と表示されてしまいます。

以下のようにしたのですがダメでした。
If String.IsNullOrEmpty(GridView1.Rows(i).Cells(1).Text) Then
GridView1.Rows(i).Cells(1).Text = "データ未設定"
End If

GridViewの列の値がNULLかどうかの判定はどのようにしたらよろしいのでしょうか?
どなたかご存知の方がいらしたらご教示下さい。

kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-08-15 12:57
RowDataBoundにて、DataItemの中身を直接見て設定する方法はどうでしょう。

RowDataBoundイベントハンドラの第二引数、GridViewRowEventArgsをeとすると、 e.Row.DataItemに今まさにバインドしたソースの該当レコード(?)が居ます。
これを適切な型にキャストしてアクセスすれば、直接(?)バインド元の値をみることができます。

例えば、DataTableをバインドしたのであれば、以下のような感じになるかと思います。

コード:

Dim drv As DataRowView = CType(e.Row.DataItem, DataRowView)
If IsDbNull(drv("カラム名")) Then
e.Row.Cells(1).Text = "データ未設定"
End If



みたいな感じでいけるのではと思います。
#コードは未検証なので、そのままは動かないかも。
#あと、RowTypeもチェックしてあげないとだめかもしれません。

<編集:誤字訂正>

[ メッセージ編集済み 編集者: kiyokura 編集日時 2008-08-15 12:58 ]
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-08-15 14:44
kiyokuraさん

アドバイスありがとうございます。

RowDataBoundイベントを新たに追加し、教えて頂いたようにやってみたのですが、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」エラーが出て島しました。
色々と試してみたのですが、やはりダメでした。

コーディング内容は
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
Dim drv As DataRowView = CType(e.Row.DataItem, DataRowView)
★ If IsDBNull(drv("seikyuymd")) Then
e.Row.Cells(1).Text = "----/--/--"
End If
End Sub

このようにしたのですが、★の行でエラーとなってしまいます。

GridView1のSqlDataSource1のデータソース構成で指定したテーブルの列名「seikyuymd」を指定したのですが、このような記載ではまずいのでしょうか???

このイベントに入った時にcells(1)の内容をデバッグしてみたのですが、現在テストデータで4件あり、3件目のこの項目(請求日)がNULLになっており、ここでこめます。
その時の内容はやはり「&nbs/p;」でした。
と言うことは、このイベント発生時はテーブルの中身が見えていない(?)のでしょうか。

何度もすいませんが、よろしくお願いします。
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-08-15 15:03
列の設定のところで、NullDisplayTextという値がが設定できると思いますが。
(BoundFieldを使っているなら)
_________________
//---
 あやのこうじ@RapidExpress
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-08-15 15:18
RapidExpressさん
GridViewの列の編集でやったらできました!
感激しちゃいました、ありがとうございました。

kiyokuraさん
いままではDataBoundであれこれとやっていたのですが、RowDataBoundとの違いが良く分からずこちらは使った事がなかったのですが、今回のアドバイスで理解できました。
ありがとうございました。

※今回はアドバイスを頂いたやり方で対処できそうですが、「&nbs/p;」そのものを判定する関数(等)はあるのでしょうか???

まだaspを使い始めて間もないので、色々と皆様の過去スレッドを検索し勉強させて頂きながらやっているのですが、どうも見当たりませんでしたので。。。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-08-15 15:26
引用:

SABUさんの書き込み (2008-08-15 14:44) より:
kiyokuraさん
RowDataBoundイベントを新たに追加し、教えて頂いたようにやってみたのですが、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」エラーが出て島しました。



えっと、実行して確認できる環境が手元いないのでアレなのですが、例外が発生しているのは、RowTypeがDataRow以外の時ではないでしょうか?

RowDataBoundはヘッダとかフッタとかでも発生しますが、そのときはバインドしているRowデータは無いので、DataItem自体がNullのはずです。

ですので、さっきのやつの最後にちょこっと書いたのですが、RowTypeを判定して、DataRowのときだけさっきの処理をやるようにすればいけそうに思います。
(If e.Row.RowType = DataControlRowType.DataRow Then 〜 End Ifで括ってやる。)

#こういうときは、ステップ実行しながら、実際にどれがNull(Nothing)なのかを見ていくと自分で追いかけれると思いますよ。


<RapidExpressさんのレスを見ての追記>
ああ、そうか!
BoundFieldだとNullDisplayTextがありますね。すっかり失念してました。
#普段、ちょっと込み入るとすぐTemplateFieldでコネコネするのでそっちばかり頭に……。<単なる言い訳です(^^;

[ メッセージ編集済み 編集者: kiyokura 編集日時 2008-08-15 15:31 ]

[ メッセージ編集済み 編集者: kiyokura 編集日時 2008-08-15 15:32 ]
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-08-15 15:42
kiyokuraさん

何度もすいません。ありがとうございます。

最初デバッグしながらやっていて、対象レコードが4件なのに6回か7回イベントが発生していたのでおかしいなぁ?と思い、データを見てみたら、ヘッダー(タイトル?)が最初に来たので、kiyokuraさんの巻末の書き込みのRowTypeチェックの意味が分かりました。

それでTypeチェックを入れてデータ行だけを見るようにしたのですが、それで実施にコケたのは3件目のレコードで、ヘッダー・フッターは大丈夫でした。
・・・説明が希薄ですいませんでした・・・

色々とやり方があるんだなと大変勉強になりました。
1

スキルアップ/キャリアアップ(JOB@IT)