- PR -

TextBox のVisibleプロパティを False に設定するとプログラムから書き込みも参照も出来なくなる。

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-26 02:07
非表示にしても問題なく動作するようなのですが... できるパターンとできないパターンというのが存在するのですか? それと、今さらすぎるのですが、System.Windows.Forms.TextBox ではなくて DataGridViewTextBoxColumn のお話だったりしますか...?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-26 08:57
じゃんぬねっとさん、お世話になります。
引用:

じゃんぬねっとさんの書き込み (2007-11-26 02:07) より:
非表示にしても問題なく動作するようなのですが... できるパターンとできないパターンというのが存在するのですか?


・・とおっしゃっておられることは、じゃんぬねっとさんのテストによるとデザイナ
で非表示に設定しておいてもBindするということでしょうか。私はこれまで4回以上
同様のテストしましたが全て同じ結果です。

引用:

System.Windows.Forms.TextBox ではなくて DataGridViewTextBoxColumn のお話だったりしますか...?


最初に記したとおりDataGridViewでの非表示列項目は、問題なく動作しますが
System.Windows.Forms.TextBox で発生しています。またTextBoxだけではなく
他の6個のコントロールに対しても同様のテストを行い、結果を2007-11-23 11:30
のスレッドで報告しましたのでご覧下さい。
なを、念のため私の環境はVisual Basic 2005 Express Edition でデータベースは
Accessで、Windowsアプリケーションを開発しています。

以上報告まで・・・


Accessでを追加

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-26 09:00 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-26 09:42
引用:

だんじりさんの書き込み (2007-11-26 08:57) より:

・・とおっしゃっておられることは、じゃんぬねっとさんのテストによるとデザイナ
で非表示に設定しておいてもBindするということでしょうか。私はこれまで4回以上
同様のテストしましたが全て同じ結果です。


ここでミニマム コードの出番ですよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-26 10:11
じゃんぬねっとさん、ありがとうございます。
「ここでミニマム コードの出番ですよ。」との指摘をいただき、考えてみましたが
2007-11-23 11:30 に結果報告いたしましたテストより単純なミニマム コードが考え
付きません。
もしかするとBind前の表示/非表示設定でしょうか。よろしくご指導下さい。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-26 10:15
引用:

だんじりさんの書き込み (2007-11-26 10:11) より:

じゃんぬねっとさん、ありがとうございます。
「ここでミニマム コードの出番ですよ。」との指摘をいただき、考えてみましたが
2007-11-23 11:30 に結果報告いたしましたテストより単純なミニマム コードが考え
付きません。
もしかするとBind前の表示/非表示設定でしょうか。よろしくご指導下さい。


以下のどこを縦読みすれば、ミニマム コード (現象が再現可能でかつ実行できる最低限のコード) になりますか?

引用:

だんじりさんの書き込み (2007-11-23 11:30) より:

RUNさん、ありがとうございます。
引用:

RUNさんの書き込み (2007-11-23 01:32) より:
最後に、今回の貴方の質問の意図ってなんだったのですか?自分には貴方が今回の問題を解決したいと思っている様には見えませんでした。仕様であると誰かに保証して欲しかっただけでは有りませんか?



おっしゃるとおり「仕様であると」誰かに保証して欲しかっただけです。
引用:

「そのようなことはないです。」との事ですが、私は非表示TextBoxとの値の読み書きは 出来ないので、不可能なのがVB.NETの仕様と考えておりました。



ところが「NO」でした。さらにじゃんぬねっとさんの指導でミニマムコードでテストした次第です。
そしてRUNさんの言われるとおり、質問者の環境は最初に説明するのは当然のことですが、上記した通り「当然の仕様」だと答えをいただけるものと思っていたことと私の動作環境は下記の通り取り立てて記載するほど特殊なことではないと考えておりました。
1.単価TextBoxのデータ取得タイミングが日数TextBoxのフォーカス喪失時であること
2.単価TextBoxはテーブルとBindしていること
3.単価TextBoxのVisibleプロパティをFalseに設定していること
あえて言うなら特殊な環境は1番ではないでしょうか、(ところが今回の現象とは無関係でした)
以上の通りRUNさんのご指摘は最もですが今回には少々違うのではないでしょうか。
ただ、じゃんぬねっとさんから指導された最も単純なテストを行っていれば、と反省しきりです。
引用:

じゃんぬねっとさんの書き込み (2007-11-22 13:46 ) より:
ミニマム コードを書きましょう。 私が提示しているコードを見れば、バインド・非表示・フォーカス喪失だけの単純な問題ではないということが明らかになります。 明らかになるということはそれだけ考えうる原因が減ったということです。 この一手が問題解決への前進になるということをよく理解した上で、どんな切り分け作業をすべきかを考えてみると良いと思います。


RUNさん、これからもよろしくご指導下さい。


Jittaさん、ありがとうございます。
引用:

Jittaさんの書き込み (2007-11-23 08:23) より:
おそらく、使用しているユーザによって単価を見せたり隠したりする仕様だと思います。でも、日数と金額がわかれば、単価もわかるのでは?
あ〜!金額も隠すのか!!だから「設定もできない」だったの?金額はともかく、単価はエンド ユーザが設定可能なんですよね?だったら、見せたり見せなかったりという仕様がおかしいのでは?見せていないとき、何が設定されるのでしょう?


単価を見せたり隠したりする仕様ではなく、最初から隠したままです。コントロールを隠すことはユーザーにどれほど優しく感じてもらえるかで決めるべきで、めったやたらに表示するものでもないと考えております。今回の場合は単価がそれほど重要でなく結果の金額と、これ以外の数多い金額を集計された合計が重要でした。
今回の質問はソフト仕様のことではなくVisibleプロパティをFalse設定しておくとBindが動作しないのではないかとの事を確認しています。
Jittaさん、今後ともよろしくご指導下さい。


ふみおさん、iStationさん、KIさん、ありがとうございます。
引用:

ふみおさんの書き込み (2007-11-22 14:35) より:
確かVisibleプロパティがFalseのコントロールはBindしないのは仕様だと思いますが、その辺は確認されていますでしょうか。


引用:

iStationさんの書き込み (2007-11-22 14:41) より:
Bingo!


引用:

KIさんの書き込み (2007-11-22 19:44) より:
Visible が False だとバインドされないのって仕様なのでしょうか?私も同様の事象で悩んだことがありまして、そのとき明確な根拠を見つけることができませんでした。仕様だという根拠をご存知なら教えて欲しいです。
バインドするときに Visible が False ならバインドが無効になるのですが、バインドするとき(Contol.DataBindings.Add を呼び出すとき)にVisible が True ならバインドされ、その後 Visible を False にしてもバインドは有効だったと記憶しています。バインドが有効かどうかは、Binding.IsBinding プロパティで確認できます。



上記はふみおさん、iStationさん、KIさん、の解答の引用ですが、私も昨夜から「Visible が False だとバインドされないのって仕様」なのかMSDN ライブラリで調べていますが、見つけ方が下手でいまだに見つかっていません。どなたか確認された方がおられれば教えてください。

また、この解答のなかに「コントロール」とありますのでTextBoxだけではなくコントロール全てに及ぶのかを調べるために次のようなテストをしてみました。

フォームに下記する7個のコントロールを配置して、それぞれに対応するButtonを配置しました。
それぞれのButtonのイベントハンドラにMessageBox.Show(対応するコントロール.Text)
と設定し(CheckBox、RadioButtonはコントロール.Checked.ToString)
全てのコントロールにテーブルのBindingSourceとBindしました。
次のようなデバッグを実行しました。
※CheckBox 、RadioButton、ComboBox、DateTimePicker、TextBox、Label、ListBox

1.7個のコントロールのVisible プロパティをTrueに設定し、デバッグを実行しました。
__結果→全てのボタンを押して正常にデータが表示されることを確認しました。
(CheckBox、RadioButtonは「True」と表示)

2.7個のコントロールのVisible プロパティをFalseに設定し、デバッグを実行しました。
__結果→各ボタンを押して表示されるメッセージは空白でした。
((CheckBox、RadioButtonは「False」と表示)

3.7個のコントロールのVisible プロパティをTrueに設定し、フォームのLoad時に
全てのコントロールに「コントロール名.Visible = False」と設定して、デバッグを実行しました。
__結果→全てのボタンを押して正常にデータが表示されることを確認しました。

以上、仕様の内容はいまだ確認できていませんが、テスト結果のみ報告します。



.ToStringを.Textに修正
[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-23 11:37 ]

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-23 12:17 ]


フローの簡易説明なら見つかりました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-26 10:33
じゃんぬねっとさん、説明不足でした。
私は「フォームに下記する7個のコントロールを配置して、それぞれに対応する
Buttonを配置しました。 それぞれのButtonのイベントハンドラに
MessageBox.Show(対応するコントロール.Text) と設定し・・」のMessageBox.Show( )
を指してミニマムコードと考えました。

表示/非表示の設定はバインド前に設定する必要からデザイナで行っています。
説明不足をお詫びします。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-11-26 10:40
こんにちは。
気になったのでやってみました。

OS:Windows XP Professional
VS:Visual Studio 2005 Professional

1.WindowsApplicationプロジェクトを新規作成
2.データ(D)->新しいデータソースの追加(N)
3.データソースの種類でデータベースを選択
4.データベースオブジェクトで適当なテーブルを選択
5.データソースウィンドウよりForm1へ適当な列をドラッグ&ドロップ(TextBox)
6.Form1へButtonコントロールを1個追加
7.Button_Clickイベントを追加し、以下のコードを追加
MessageBox.Show(Me.(列名)TextBox.Text)

この状態で、(列名)TextBoxのVisibleプロパティを<del>IDE</del>デザイナのプロパティウインドウより操作。

Visible=Trueの場合はMessageBoxにデータの値が表示。
Visible=Falseの場合は何も表示されないMessageBoxが表示。

Visibleプロパティの操作をForm_Loadイベントなど、Formのコンストラクタ以外で操作した場合はデータの値が表示。

ちなみに、Visual C# 2008 Express Edition Beta2でも同様の結果となりました。

[追記]
MessageBox.Show以外のコードは自動生成されたものです。

[ メッセージ編集済み 編集者: J.J. 編集日時 2007-11-26 11:05 ]

本文修正。

[ メッセージ編集済み 編集者: J.J. 編集日時 2007-11-26 11:43 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-26 10:53
引用:

だんじりさんの書き込み (2007-11-26 10:33) より:

じゃんぬねっとさん、説明不足でした。
私は「フォームに下記する7個のコントロールを配置して、それぞれに対応する
Buttonを配置しました。 それぞれのButtonのイベントハンドラに
MessageBox.Show(対応するコントロール.Text) と設定し・・」のMessageBox.Show( )
を指してミニマムコードと考えました。

表示/非表示の設定はバインド前に設定する必要からデザイナで行っています。
説明不足をお詫びします。


これも "コード" ではないわけですが、それはさておき。 これだけでは再現しません。 というより、バインド部分の説明が不足しているのではないでしょうか。 'どの' TextBox が '何' とバインドするかの説明が必要です。 どのコードを用いてバインドしているのかも必要です。

こういう漏れが発生するからコードで書くことを強く強く推奨するわけです。 私の投稿が当初から 「わざとらしい」 と感想をお持ちの方がいらっしゃるようなのでそろそろ私も素直な投稿をしたいのですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)