none
TextBox.Visible = false を何処で設定するかによって保存処理が異なる RRS feed

  • 質問

  • TextBox を非表示にした際、そのデータの保存状況に、何をもって非表示にし
    たかで違いが生じています。理由をご存知の方、お教え願えませんか。

     

     

    DataGridView に以下のデータを連結し、その「詳細」も同じ Form 上に並べて
    表示させました (末尾再現映像参照)。


    syllabary.columns

    コード ブロック
    id    INT         NOT NULL    PrimaryKey
    name  VARCHAR(50) NOT NULL
    char  VARCHAR(50)

     


    あらかじめ "NOT NULL" な "name" を設定して保存した後、Form 上のボタンを
    押すことで "char" にプログラムから値を代入するようにしています。


    「詳細」の charTextBox はあらかじめ非表示にしています。


    この非表示の仕方によって、ボタンによる charTextBox 代入後の保存で、
    "char" の値が保存されたりされなかったりしています。


    結果は、


    コード ブロック

      (A) charTextBox.Visible = false を「プロパティ ウィンドウ」で設定した場合


          → 保存されない


      (B) Form_Load() で charTextBox.Visible = false と設定した場合


          → 保存される

     

    具体的な操作手順は以下の通りです。


    コード ブロック

      (1) DataGridView の name 列に予 (あらかじ) め値を設定して保存


      (2) 保存した DataGridView の行を選択


      (3) 詳細側に選択した行の値が出ていることを確認


      (4) 「時刻設定」ボタンを押して charTextBox に値を代入


      (5) Navigator の保存ボタンを押す


      (6) DataGridView の char 列を見て保存されたかどうか確認

     

    上記の通り、非表示な charTextBox の内容が保存されたかされなかったかの確
    認は、保存処理後の DataGridView の char 列に時刻が表示されたかどうかで
    行っています。


    再現映像をご覧になるのが一番早いと思いますので、ご覧ください。


    - 再現映像 (42sec)

      ※ 「詳細」の char 入力ボックスを非表示にしています。「時刻設定」ボタンの上辺り。


    - ダウンロード : サンプルコード

     

    同じ Visible = false という設定なのに、何故このような違いが生じたのか不明です。


    お分かりの方、いらっしゃいますか?

    2008年1月20日 16:46

回答

すべての返信

  • 以下の現象と同じだと思いますが、原因はなんでしょうね?
    フォーラムで何度か「非表示コントロールに対してバインドは機能しない」のような話がありましたが、単純ではないようです。

    非表示コントロールをバインドして利用する場合は、フォームの初期化の後で Visible を false にする方が良さそうです。

     

    コード ブロック

    private void button1_Click(object sender, EventArgs e)
    {
        // これを true にするか false にするかで、下のメッセージの表示で
        bool after = true;

     

        TextBox textBox1 = new TextBox();


        if (!after) textBox1.Visible = false;
        this.Controls.Add(textBox1);
        if (after) textBox1.Visible = false;

     

        textBox1.DataBindings.Add("Text", "バインド値", null);

     

        // "バインド値" という値が表示されるかどうかが変わる
        MessageBox.Show(textBox1.Text);
    }

     

     

    2008年1月21日 6:02
  • 以下が参考になると思います。Visible=falseのコントロールのCreateHandelメソッドが呼び出されないため、そのコントロールハンドルが作られないのが原因っぽいですね。

     

    TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42373&forum=7&start=96&101

    2008年1月21日 7:22
    モデレータ
  • trapemiya さんが書かれた Handle の件も関係あると思い、先ほどは試していたのですが、追試してみたら条件がもう少しわかりました。
    Controls への追加(Parent の割り当て)までに Handle が生成される場合でも、微妙な違いがあるようです。
    # 先ほどはNGの方で検証してました。

     

    ◆OK
    IntPtr h = textBox1.Handle; // この時点では Visible は true
    textBox1.Visible = false;
    this.Controls.Add(textBox1);

     

    ◆NG
    textBox1.Visible = false;
    IntPtr h = textBox1.Handle;
    this.Controls.Add(textBox1);

     

    HandleCreated イベントで確認すると、どちらでもハンドルは生成されているようですが、なぜ違いが現れるのでしょうね。

    2008年1月21日 7:57
  • TH01さん、trapemiya さん、サポートありがとうございます。


    またハンドル絡みなんですか。

    取り敢えず回避方法があるのでそれで対処します。

     

    既出だったの気づきませんでした。

    ただ、詳しい方々の話しが読めて参考になりました。

     

    ありがとうございます。

    2008年1月21日 9:58