- PR -

DataGridのセルの色指定時の例外エラー

1
投稿者投稿内容
Ken2
会議室デビュー日: 2004/10/26
投稿数: 4
投稿日時: 2004-11-27 11:04
DataGridTextBoxColumnの派生クラスを作成し、特定の条件時にセルのbackBrushを変更する処理をしています。正しく動作することは、確認済みです。

ここで、date型のフィールドを追加したところ、指定されたキャストは有効ではありません。と、エラーが出るようになりました。調べたところ、追加したフィールドにnullがある場合に発生しているようです。

どうすれば回避できるか、お知恵をお借りしたいと思います。
よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-27 12:23
諸農です。

> どうすれば回避できるか、お知恵をお借りしたいと思います。

どのような拡張をしているのか、具体的に提示していただきたいと思います。

ちなみに拡張しているところで無理にキャストしている部分って無いですか?
あと、AllowDBNull とか NullText とかもありますけど、どうなっているのでしょうか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Ken2
会議室デビュー日: 2004/10/26
投稿数: 4
投稿日時: 2004-11-27 13:09
すみません。具体的には、
コード:

public class DataGridBackBrush : DataGridTextBoxColumn
{
protected override void Paint(Graphics g,
Rectangle bounds,
CurrencyManager source,
int rowNum,
Brush backBrush,
Brush foreBrush,
bool alignToRight)
{
object cellValue = this.GetColumnValueAtRow(source, rowNum);
if ((int) cellValue < 0){
backBrush = new SolidBrush(Color.Red);
}else if ((int) cellValue >= 0 | (int) cellValue <= 5){
backBrush = new SolidBrush(Color.Yellow);
}
base.Paint(g, bounds, source, rowNum,backBrush, foreBrush, alignToRight);
}
}


呼び出し側は
DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "table1";

DataGridBackBrush cs;
cs = new DataGridBackBrush();
cs.MappingName = "field1";
cs.HeaderText = "*****";
ts.GridColumnStyles.Add(cs);

ts.GridLineColor = Color.BlueViolet;
dataGrid1.TableStyles.Add(ts);



date型のしかもnullを含むフィールドを追加したときのみエラーとなります。
left inner join句で結合した右側のテーブルにあるdate型のフィールドが
問題となっています。


[ メッセージ編集済み 編集者: Ken2 編集日時 2004-11-27 13:14 ]

[ メッセージ編集済み 編集者: Ken2 編集日時 2004-11-27 13:16 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-27 13:24
諸農です。

引用:

コード:
object cellValue = this.GetColumnValueAtRow(source, rowNum);
if ((int) cellValue < 0){




前にも書きましたが、この部分って無理にキャストしていることになりませんか?
cellValueにDBNullが想定されるのであれば、それ相応の対処を書く必要があるのでは?
と言うよりも前に、Exceptionが発生している部分ってどこなんでしょうか?
そこをつぶしたいんですよね?

引用:

date型のしかもnullを含むフィールドを追加したときのみエラーとなります。
left inner join句で結合した右側のテーブルにあるdate型のフィールドが
問題となっています。


う〜〜ん、何を問題にされているのでしょうか?

クラス外のプログラミングのところで、nullを含むレコードを返してしまう処理を書いているのが問題なんでしょうか?
であれば、nullを含まないようにSQLを書き換えればいいのではないでしょうか。クラスで対処する必要は無くなりますよね?

それとも、最初の段階で書かれているとおり、クラス内部の話で、フィールドがnullでも適切に表示したいと言うことを問題にしているのでしょうか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Ken2
会議室デビュー日: 2004/10/26
投稿数: 4
投稿日時: 2004-11-27 14:11
何度もすみません。どうもありがとうございます。
引用:

Jubeiさんの書き込み (2004-11-27 13:24) より:

引用:

コード:
object cellValue = this.GetColumnValueAtRow(source, rowNum);
if ((int) cellValue < 0){




前にも書きましたが、この部分って無理にキャストしていることになりませんか?


省略していましたが、GetColumnValueAtRowの前に
if (cellValue != null){
が入ります。これではいけませんか?

引用:

引用:

date型のしかもnullを含むフィールドを追加したときのみエラーとなります。
left inner join句で結合した右側のテーブルにあるdate型のフィールドが
問題となっています。



それとも、最初の段階で書かれているとおり、クラス内部の話で、フィールドがnullでも適切に表示したいと言うことを問題にしているのでしょうか?



言葉足らずですみません。
フィールドの型が、文字列や数値型の場合はNULL値があってもエラーは発生しません。
date型のフィールドにNULL値があった場合エラーとなるので、どうすればよいのか?

フィールドの型は、フィルタ処理等で使用したいのでdate型のままにしておきたいのです。
伝わりましたでしょうか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-27 14:49
諸農です。

Exceptionが発生している箇所は特定できたのでしょうか?
Exceptionが発生している理由はキャストが無効ということですよね。

引用:

省略していましたが、GetColumnValueAtRowの前に
if (cellValue != null){
が入ります。これではいけませんか?



で、nullデータの時にこのコード部分はすり抜けてくるんでしょうか?
cellValueにインスタンスが設定されていたらnullではないのですり抜けるのでは?
DBのnull値は、先にも書きましたがDBNullクラスを使って判定します。

別のサイトになりますが、次の投稿にあるoverrideされたPaintメソッドが参考になると思います。
GDNJ DataGrid、列の色指定



_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-11-27 14:52 ]
Ken2
会議室デビュー日: 2004/10/26
投稿数: 4
投稿日時: 2004-11-27 16:45
引用:

別のサイトになりますが、次の投稿にあるoverrideされたPaintメソッドが参考になると思います。
GDNJ DataGrid、列の色指定


このページが、大変参考になりました。無事解決いたしました。
どうもありがとうございました。
1

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