none
DataGridView の Cell に値が セットされない RRS feed

  • 質問

  • 毎々お世話になっております。

    WindowsXP-Pro Ver.2002 SP2 上で
    Visual Studio 2005 Enterprise Edition でVB2005による開発を行っております。

    DataGridView_A で手入力された文字列を DataGridView_B の非表示の列に格納させようと思うのですが、
    なぜかセットされません。

    Me.DataGridView_B.CurrentRow.Cells(ColIndex_B).Value = Me.DataGridView_A.CurrentRow.Cells(ColIndex_A).Value.ToString

    DataGridView_B は ReadOnly = False で、セルの ReadOnly も False です。

    なにがいけないのでしょうか?

    よろしくお願いします。

     

    2011年11月7日 0:34

回答

  • こちらで試して見ましたが再現しませんでした。カレント行でも問題なくセットできます。 テスト用に新たにプロジェクトを作成し、問題が発生する最小限のコードを作成されるようにテストすれば、何かに気付かれるかもしれません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月7日 5:16
    モデレータ
  • Microsoft.VisualBasic.dll にて例外が発生しているということは、提示されたコード以外のへっぽこドラマーさんが書かれたコードが原因で発生してそうに思います(暗黙の型変換などで)。

    例外の発生時に、呼び出し履歴やスタックトレースを確認することで、問題の位置の特定ができないでしょうか?

    > AlternateRowsDefaultCellStyle でBackColor を一行おきに変更されるようにしている事が起因しているのでしょうか?

    そのように思われた場合、まずはへっぽこドラマーさん自身で新規作成したプロジェクトでも問題が発生するのか確認されると良いですね。
    と書きつつ念のため試してみましたが、それが問題になることはありませんでした。

    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月9日 8:37
  • 試しにテストプロジェクト上でミニ画面を作ってみましたら、問題なく代入できました。

    さすがにこうなるとこちらで問題を再現するのが難しいですし、何が原因なのかを探るのも難しい状況です。要するに、どこかに原因があるのでそれを探らなけれないならない状況、つまりデバッグしなければ原因を突き止めることが難しい状況です。手元にソースがあれば私も何かお手伝いができそうなのですが、現在、何もできない状態です。
    ですから、へっぽこドラマーさんがどうやったら原因を見つけられるかという、その手段をアドバイスすることぐらいしかできません。といっても王道があるわけではなく、とりあえずぐちゃぐちゃに潰れてもいいように本番プロジェクトのコピーを作成し、そのコピーのプロジェクトで一つずつ機能を削って行くのが良いと思います。
    また、正常に動作しているテストプロジェクトにおけるDataGridViewとの違いを洗い出すのも有効な方法です。違いを洗い出すにはそれぞれのInitializeComponentにおけるDataGridViewに関する記述を比較すれば良いでしょう。InitializeComponentは、コードエディタの上部にあるナビゲーションバーの右側のコンボボックスから簡単に開くことができます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2011年11月16日 8:57
    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月10日 1:06
    モデレータ

すべての返信

  • ご提示されたコードは全く問題ありませんので、他のところに問題があるように思います。ColIndex_AやColIndex_Bに思わぬ値が入っていて他のセルが更新されているとか、代入先のセルではないセルを誤って確認されているとか、ちょっとした勘違いということはありませんでしょうか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年11月7日 1:09
    モデレータ
  • trapemiya様、回答ありがとうございます。

    指摘された、ColIndex_A、ColIndex_B ですが、実際はColIndex_A は列が一つしかないその列名を直接指しており、

    またColIndex_B はConst で定義した固定値を使用しております。つまり

    Me.DataGridView_B.CurrentRow.Cells(CNST_CELLB).Value = Me.DataGridView_A.CurrentRow.Cells("セルA").Value.ToString

    の形です。

    別のセルに入ってしまっている…というのは考えにくいかと思います。

    DataGridView 自身やCellのプロパティに何か足りないものがあるのではないかと考えているのですが…。

    よろしくお願いします。

    <<追加します。>>」

    Dim iRow As Integer

    iRow = Me.DataGridView_B.CurrrentRow.Index

    Me.DataGridView_B.Rows(iRow+1).Cells(CNST_CELLB).Value = Me.DataGridView_A.CurrentRow.Cells("セルA").Value.ToString

    試しに↑のようにカレント行以外の行に値をセットしてみたら、正しくセットされました。

    カレント行の非表示セルには値のセットはできないのでしょうか?

    よろしくお願いします。

    2011年11月7日 1:52
  • こちらで試して見ましたが再現しませんでした。カレント行でも問題なくセットできます。 テスト用に新たにプロジェクトを作成し、問題が発生する最小限のコードを作成されるようにテストすれば、何かに気付かれるかもしれません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月7日 5:16
    モデレータ
  • trapemiya様、ありがとうございます。

    テスト用プロジェクトはまだ作ってないのですが、どうもカレント行ではなく1行目に限って代入ができないようです。

    またVisual Studio のデバッガ上(Immediateウィンドウ)で1行目の対象列に値を突っ込んだところ、

    「'System.InvalidCastException' の初回例外が Microsoft.VisualBasic.dll で発生しました。」エラーが発生しました。

    なぜか他の行への代入はエラーになりません。

    なにか特殊な設定が効いてしまっているのでしょうか?

    よろしくお願いします。

    2011年11月7日 9:37
  • こちらでは1行目でも問題なく実行できます。'System.InvalidCastException' が出ているようですが、それはどこで出ているのでしょうか? そこが手掛かりとなると思います。デバッグした際に1行目に限ってそこを通るのか、1行目ではうまく何かを参照できないなど、その辺りを追ってみると良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年11月8日 0:43
    モデレータ
  • trapemiya 様、ありがとうございます。

    件のエラーは DataGridView のCell に値をセットした際に発生します。

    (iRow = 0 の場合)
    Me.DataGridView_B.Rows(iRow).Cells(CNST_CELLB).Value = Me.DataGridView_A.CurrentRow.Cells("セルA").Value.ToString

    このステップは行位置に影響せず、"セルA"Cell のCellEndEdit イベント で実行されるステップです。

     

    また、1行目で発生して他の行では問題ないように思われたのですが、奇数行目でははじかれ偶数行目では正しくセットされる事が分かりました。

    AlternateRowsDefaultCellStyle でBackColor を一行おきに変更されるようにしている事が起因しているのでしょうか?
    (AlternateRowsDefaultCellStyle で設定変更しているのはBackColorのみ です)

    よろしくお願いします。

    2011年11月9日 2:58
  • いろいろな情報が少しずつ出てきて全体的に把握しかねています。最初はボタンクリックイベントでしたが、実際にはCellEndEditイベントでも実行されているということでしょうか? やはり再現する必要最低限のコードを示していただいた方が、話の進みが速いと思います。
    通常は問題ないコードですので何かが影響を与えていると思うのですが、私の方でも再現できなければ現在のところアドバイスが難しい状況です。コードが無い状態でデバッグを行うような状況になっており、アドバイスが難しいことをご理解下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年11月9日 6:35
    モデレータ
  • Microsoft.VisualBasic.dll にて例外が発生しているということは、提示されたコード以外のへっぽこドラマーさんが書かれたコードが原因で発生してそうに思います(暗黙の型変換などで)。

    例外の発生時に、呼び出し履歴やスタックトレースを確認することで、問題の位置の特定ができないでしょうか?

    > AlternateRowsDefaultCellStyle でBackColor を一行おきに変更されるようにしている事が起因しているのでしょうか?

    そのように思われた場合、まずはへっぽこドラマーさん自身で新規作成したプロジェクトでも問題が発生するのか確認されると良いですね。
    と書きつつ念のため試してみましたが、それが問題になることはありませんでした。

    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月9日 8:37
  • trapemiya 様、ありがとうございます。

    整理したいと思います。

    質問の対象となっているアプリは、

    (1)画面には入力用のDataGridView_A と表示用のDataGridView_B があります。

    (2)入力用のDataGridView_A はRowHeader と入力用の1列で構成されており、表示用のDataGridView_B 上でクリック等により
       行選択されるとDataGridView_B の選択行の非表示列の内容を DataGridView_A に表示させるようにしてあります。

    (3)入力用のDataGridView_A の値が変更された場合は、DataGridView_Bの対応する非表示列に変更後の値を格納させます。
       ※変更の検知はCellEndEditイベントにより拾っています。

    といった仕様です。

    ここで(3)の処理でなぜか格納できたり、できなかったたりが1行おきに発生しています。

    よろしくお願いします。

     

    2011年11月9日 17:55
  • TH01 様、ありがとうございます。

    例外の発生は、一般的なシステムエラーのメッセージボックスの形式ではなく、VisualStudio のデバッガのImmediateウィンドウ上での
    メッセージ出力です。

    ざっと調べたところ、この手の例外は無視しても構わない といった書き込みも見受けられたのですが、
    現実に代入されないのは事実で、たいへんこまってしまっています。

    また、ALternateRowsDefaultCellStyle を解除してみましたが、やはり現象は変わりませんでした。(当たり前といえば当たり前ですよね)

    試しにテストプロジェクト上でミニ画面を作ってみましたら、問題なく代入できました。
    が、このDataGridView を本番プロジェクトの画面にコピーし、コントロール名を合わせたり列を増やしたりしたら、
    結局同じ現象が発生するようになってしまいました。(当然といえば当然ですよね)

    DataGridView に行なっている プロパティの設定を一つ一つ外して、代入の可否を確認するしかないのでしょうか?

    心当たりのある方がいらっしゃったら、助けてください。

     

    2011年11月9日 18:09
  • 試しにテストプロジェクト上でミニ画面を作ってみましたら、問題なく代入できました。

    さすがにこうなるとこちらで問題を再現するのが難しいですし、何が原因なのかを探るのも難しい状況です。要するに、どこかに原因があるのでそれを探らなけれないならない状況、つまりデバッグしなければ原因を突き止めることが難しい状況です。手元にソースがあれば私も何かお手伝いができそうなのですが、現在、何もできない状態です。
    ですから、へっぽこドラマーさんがどうやったら原因を見つけられるかという、その手段をアドバイスすることぐらいしかできません。といっても王道があるわけではなく、とりあえずぐちゃぐちゃに潰れてもいいように本番プロジェクトのコピーを作成し、そのコピーのプロジェクトで一つずつ機能を削って行くのが良いと思います。
    また、正常に動作しているテストプロジェクトにおけるDataGridViewとの違いを洗い出すのも有効な方法です。違いを洗い出すにはそれぞれのInitializeComponentにおけるDataGridViewに関する記述を比較すれば良いでしょう。InitializeComponentは、コードエディタの上部にあるナビゲーションバーの右側のコンボボックスから簡単に開くことができます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2011年11月16日 8:57
    • 回答としてマーク 山本春海 2011年11月21日 9:07
    2011年11月10日 1:06
    モデレータ
  • こんにちは、へっぽこドラマー さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。
    その後いかがでしょうか。

    みなさんから参考になる情報をいただいていると思われましたので、勝手ながら私のほうで回答としてマークさせていただきました。
    アドバイスくださったみなさん、ありがとうございます。

    へっぽこドラマー さん、みなさんからアドバイスいただいているように、このまま情報を待つよりも問題が再現する最小限のコードを提示されるなどご検討されたほうが解決は早いと思います。
    もしまだ解決されていない場合には、ご検討くださいね。お手数ですが、その際には新規に投稿をお願いいたします。(適宜こちらのスレッドのリンクを記載するなどしてくださいね。)
    解決されている場合には、情報の更新をしていただけるとうれしいです。

    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                     
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年11月21日 9:07