none
DataRepeater (Visual Basic Power Packs)の入力値が取り消されてしまう RRS feed

  • 質問

  • はじめて投稿します。よろしくお願いします。

    開発環境 : Windows 7 SP1、.NetFrameWork4.0.3

    使用言語 : VB.net(Visual Studio 2010 Professional) + Microsoft Visual Basic Power Packs Vs10.0.0.0

    Windows Forms のアプリケーションをDataRepeaterを使用して開発しております。
    DataRepeaterはBindingSourceと連結しており、幾つかのテキストボックスを乗せております。
    MicroSoftのチュートリアルに沿って、DataSetの中にDataTableを準備し、DataTableからデザイナのDataRepeater上に
    項目をDrag&Dropして配置しています。

    このような状況で複数のテキストボックスに値を入力した後に、マウスクリックで行を移動した時のみ、最後に入力した
    テキストボックスの入力した値が取り消されるという現象が発生しております。

    ただし、以下の場合は正しく入力した値が反映されます。
    ・タブで移動した時は複数のテキストボックスに入力した場合でも、入力値は正しく反映される。
    ・テキストボックスを1つだけに入力し、マウスクリックで行を移動した場合は正しく入力値が反映される。

    なお、Tabとマウスクリックのイベントは発生順が異なるということに着目し、イベントの発生順を調べてみたところ以下の
    結果が得られています。

    【1項目のみ入力後、マウスクリックで次の行へ移動した場合のイベント発生順】
      Enter→ 
      TextChange→ 
      次の行のテキストボックスをクリック→ 
      BindingSourceCurrentChanged→ 
      CurrentItemChanged→ 
      Leave→ 
      Enter 
    【2項以上入力後マウスクリックで次の行へ移動した場合のイベント発生順】
      Enter→ 
      TextChange→ 
      次の行のテキストボックスをクリック→ 
      BindingSourceCurrentChanged→ 
      TextChange(※注)→ 
      CurrentChanged→ 
      CurrentItemChanged→ 
      Leave→ 
      Enter 
    (※注)複数項目入力した際になぜ再度TextChangeイベントが走ってしまうのか不明    
    ここ(TextChangeイベント)ではCurrentItemはNothingになってしまっているため、    
    入力していた値へのアクセス自体が不可になってしまっている   


    上記不具合の解消方法を模索していますが、解決に至っていません。
    マウスクリックで行を移動した時にも、テキストボックスの入力値を正常に反映するにはどのようにすれば良いでしょうか。

    2014年3月3日 3:03

回答

  • 私の方ではマウスクリックでは再現しませんでしたが、マウスのホイールを回すと再現しました。DataRepeaterにはいろいろ問題があるのかもしれません。例えば、以下の情報もありました。

    DataRepeter にて正常に更新されない
    https://connect.microsoft.com/VisualStudio/feedback/details/716430/datarepeter

    状況を見ていると、何かの設定でどうにかなるというよりはバグっぽい動きだと思いますが、コネクトでは、もうVisual Studio 2010は扱っていないようですので、コネクトに報告することもできませんね・・・。

    DataRepeterの代わりになるようなコントロールは標準のWindowsフォームにはないので、UIの設計変更が素直だと思います。もしくは、WPFを使われるとより簡単により複雑なことができます。

    ちなみに私の方で問題が発生したマウスホイールの件ですが、そのTextBoxのTextChangeイベントハンドラでBindingSourceのEndEditメソッドを呼ぶようにしたところ、とりあえず回避できました。完璧に対処療法ですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月5日 5:12
    • 回答としてマーク DataRepeater 2014年3月10日 0:45
    2014年3月3日 6:11
    モデレータ

すべての返信

  • 私の方ではマウスクリックでは再現しませんでしたが、マウスのホイールを回すと再現しました。DataRepeaterにはいろいろ問題があるのかもしれません。例えば、以下の情報もありました。

    DataRepeter にて正常に更新されない
    https://connect.microsoft.com/VisualStudio/feedback/details/716430/datarepeter

    状況を見ていると、何かの設定でどうにかなるというよりはバグっぽい動きだと思いますが、コネクトでは、もうVisual Studio 2010は扱っていないようですので、コネクトに報告することもできませんね・・・。

    DataRepeterの代わりになるようなコントロールは標準のWindowsフォームにはないので、UIの設計変更が素直だと思います。もしくは、WPFを使われるとより簡単により複雑なことができます。

    ちなみに私の方で問題が発生したマウスホイールの件ですが、そのTextBoxのTextChangeイベントハンドラでBindingSourceのEndEditメソッドを呼ぶようにしたところ、とりあえず回避できました。完璧に対処療法ですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月5日 5:12
    • 回答としてマーク DataRepeater 2014年3月10日 0:45
    2014年3月3日 6:11
    モデレータ
  • trapemiya(MVP)さま

    お礼が遅くなり失礼いたしました。ご回答ありがとうございます。

    BindingSourceのEndEditを呼ぶ方法ですが、TextBoxのTextChangeイベントハンドラ内での呼び出しですと、TextBoxの各項目同士の計算処理も実装した際に(こちらの情報は後出しになり申し訳ありません)以下の通りには、うまく動いてくれません。

    例)単価 × 数量 = 売上

    単価を変更してテキストボックスを移動した際に売上が自動計算で更新される

    もう少し調査をしてみたいと思います。

    UI設計変更やWPFについても参考にさせていただきたいと思います。

    ありがとうございました。

    何かほかにも情報がある場合は引き続きよろしくお願いします。

     

    2014年3月10日 0:53