none
DataGridView のBool型の取得 RRS feed

  • 質問

  • DataGridView のcellの値を取得しようとしています。

    cellの値がstring型であれば、dataGridView1["ID", i].Value.ToString();
    で、問題ないと思うのですが、
    cellの値がbool型(bit型というのでしょうか?)のときに

    bool ok;
    if (dataGridView1["ID", i].Value.ToString() == true.ToString())
     ok = true;
    else
     ok = false;
    という条件式は、何だか変な感じがします。
    true かfalse かを判断する普通の方法を教えていただきたいと思います。

    環境
    Visual Studio 2010 C#
    Vista Home Premium

    • 編集済み yasheeki 2010年12月30日 3:02 理解困難
    2010年12月30日 3:01

回答

  • こんな感じでしょうか。

    object obj = dataGridView1["ID", i].Value;

    bool? ok;
    if (obj is DBNull)
    {
        ok = null;
    }
    else
    {
         ok = (bool?)obj;
    }

    でも、bool 型のカラムに null 許容があるとは思えませんが、ちょっと
    遊びすぎではないですか?

    • 回答としてマーク yasheeki 2010年12月31日 15:17
    2010年12月31日 8:40

すべての返信

  • 単純に以下のようにすればいいのでは?

    bool ok = (bool)dataGridView1["ID", i].Value;

    • 回答としてマーク yasheeki 2010年12月30日 22:43
    • 回答としてマークされていない yasheeki 2010年12月31日 6:34
    2010年12月30日 4:10
  • SurferOnWwwさんが書かれている通りで問題は解決しますが、trueやfalseと比較する条件式について少し書いておきます。

    if文での条件判断は、カッコ内がtrueかfalseで判断しますので、必ずしもカッコ内が==で比較する式になっている必要はありません。
    つまり、if (・・・) の・・・は、==で比較した結果がtrueかどうかでも、
    bool a = true;
    if (a) {  }
    でaがtrueかどうかでも良いのです。したがって、

    if ((bool)dataGridView1["ID", i].Value == true) は、

    if ((bool)dataGridView1["ID", i].Value) で、十分ですし、

    if ((bool)dataGridView1["ID", i].Value == false) は、

    if (!(bool)dataGridView1["ID", i].Value) で、十分です。

    また、以下のように、flgがtrueならflgをfalseに、flgがfalseならflgをtrueにしたい場合、以下のように書かれているのをたまに見かけます。

    bool flg;

    if (flg)
         flg = false;
    else
         flg = true;

    これも、以下のように簡潔に書けます。

    flg = !flg;

    このように、trueやfalseと比較する場合は、少し視点を切り替えられると良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年12月30日 6:31
    モデレータ
  • ご教授ありがとうございます。

    2010年12月30日 22:46
  • いつも(bool) というような型変換が思い浮かばないのです。

    申し訳ありません。解決したかと思ったのですが、このカラムがnull許容の場合には、どんな方法があるでしょうか?

    ご教授お願い申しあげます。

    • 編集済み yasheeki 2010年12月31日 6:37 説明不足
    2010年12月30日 22:48
  • 簡潔に書くのであれば、null合体演算子があります。

    C#でnullチェックを簡潔に行うには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/991coalescingop/coalescingop.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年12月31日 7:53
    モデレータ
  • こんな感じでしょうか。

    object obj = dataGridView1["ID", i].Value;

    bool? ok;
    if (obj is DBNull)
    {
        ok = null;
    }
    else
    {
         ok = (bool?)obj;
    }

    でも、bool 型のカラムに null 許容があるとは思えませんが、ちょっと
    遊びすぎではないですか?

    • 回答としてマーク yasheeki 2010年12月31日 15:17
    2010年12月31日 8:40
  • 参考になるものをご紹介いただき、ありがとうございます。

    しかし、下記の方法を使ってみたところ、旨く行きました。

                    if (personsGrid["IsDead", pos].Value.ToString() == "")
                        ok = false;
                    else
                        ok = (bool)personsGrid["IsDead", pos].Value;

    でも、やっぱりここで、

    .Value.ToString() == ""

    というような変な方法しか思い浮かびません。この場合は(bool)ではない何か別のキャスト方法などがあるのでしょうか?

    • 編集済み yasheeki 2010年12月31日 8:50 食い違い
    2010年12月31日 8:48
  • わが道を行くって感じですね。
    2010年12月31日 14:21
  • ありがとうございます。

    おっしゃる通り、bool 型のカラムが3択になっているのは変でした。
    普通に、nullを許容していなければ、こんな問題も起こらないということでしたが、
    ご教授いただいたコードをありがとうございます。
    こちらも、とても参考になりました。

     

    2010年12月31日 15:21