トップ回答者
TextBox.Visible = false を何処で設定するかによって保存処理が異なる

質問
-
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 列に時刻が表示されたかどうかで
行っています。
再現映像をご覧になるのが一番早いと思いますので、ご覧ください。※ 「詳細」の char 入力ボックスを非表示にしています。「時刻設定」ボタンの上辺り。
同じ Visible = false という設定なのに、何故このような違いが生じたのか不明です。
お分かりの方、いらっしゃいますか?
回答
-
以下が参考になると思います。Visible=falseのコントロールのCreateHandelメソッドが呼び出されないため、そのコントロールハンドルが作られないのが原因っぽいですね。
TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42373&forum=7&start=96&101
すべての返信
-
以下の現象と同じだと思いますが、原因はなんでしょうね?
フォーラムで何度か「非表示コントロールに対してバインドは機能しない」のような話がありましたが、単純ではないようです。非表示コントロールをバインドして利用する場合は、フォームの初期化の後で 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);
} -
以下が参考になると思います。Visible=falseのコントロールのCreateHandelメソッドが呼び出されないため、そのコントロールハンドルが作られないのが原因っぽいですね。
TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42373&forum=7&start=96&101 -
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 イベントで確認すると、どちらでもハンドルは生成されているようですが、なぜ違いが現れるのでしょうね。