- PR -

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

投稿者投稿内容
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2007-11-22 14:41
引用:

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



Bingo!

[ メッセージ編集済み 編集者: iStation 編集日時 2007-11-22 16:11 ]
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-22 18:00
じゃんぬねっとさん、ありがとうございました。
確かにミニマムコードを書きテストしていれば私の実際にそくしたテストの結果が
相反しており、相反した環境の違いを考察したはずです。以下その違いを連記します。
1.取得のタイミングがフォーカス喪失時の違い
2.単価の書き込みがプログラムとテーブルのBindの違い
3.Visible=Trueの設定がデザイナ時と実行時(プログラム)の違い
この内1.のフォーラス喪失時であるためと思い込んでしまったのが間違いの原因でした。

ところが次のヒントをいただいた時点で2.の単価の書き込み問題と気付きました。
J.J.さん(どの時点(操作)で単価TextBoxに値が入っているか ・・・)
まるくさん(なんらかの要因で 単価TextBox.Text に値が入らず・・)
確かにミニマムコード、極端に言えばMessageBox.Show(単価TextBox.Text)が原因を
見出す最大のコードであることを今回は認識させられました。

ふみおさん、iStationさん、ありがとうございます。
まだ確認が出来ていませんが「Visibleプロパティ=False時のコントロールはBindしない」
ことが仕様だとすると、テーブルデータとBindする場合は、Visibleプロパティ=False
にしないでTrueの設定のまま何かに隠して配置する必要がありますね。
「Visibleプロパティ=False時のコントロールはBindしない」の確認が取れれば、この
スレッドに報告します。







[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-22 18:02 ]

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-22 19:31 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-11-22 19:44
Visible が False だとバインドされないのって仕様なのでしょうか?
私も同様の事象で悩んだことがありまして、
そのとき明確な根拠を見つけることができませんでした。
仕様だという根拠をご存知なら教えて欲しいです。

バインドするときに Visible が False ならバインドが無効になるのですが、
バインドするとき(Contol.DataBindings.Add を呼び出すとき)に
Visible が True ならバインドされ、その後 Visible を False にしても
バインドは有効だったと記憶しています。
バインドが有効かどうかは、Binding.IsBinding プロパティで確認できます。

参考になりましたら。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-11-22 20:42
KIさん、ありがとうございます。

Visible が False だとバインドされないは仕様なのかはまだ確認できていません。
確認できればこのスレッドに報告いたします。

ただKIさんの言われる「バインドするときにVisible が True ならバインドされ、
その後 Visible を False にしてもバインドは有効だった」との仮説に対して、
何時Visible を FalseにしてもBindが有効なのかを早速テストしてみました。

なんと、フォームをLoadするときに単価TextBox.Visible = Falseと設定すれば
単価TextBoxは非表示になり、かつBimdは有効でした。だとするとVisible = False
に設定するとBindが無効になるのが仕様であったとしてもデザイナでVisible = True
に設定しておき、フォームをLoad時にVisible = Falseに設定すれば、TextBoxの
非表示の設定とBindingSourceとのBindが両立することとなります。

実際に開発中のソフトのTextBoxを上記のように設定し、動作させてみて正常に動作
することを確認して、その結果をこのスレッドに報告いたします。
KIさん、大変貴重な経験をお話いただき、ありがとうございました。


5行目説明の追加


[ メッセージ編集済み 編集者: だんじり 編集日時 2007-11-22 20:55 ]
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2007-11-23 01:32
引用:

だんじりさんの書き込み (2007-11-22 18:00) より:
じゃんぬねっとさん、ありがとうございました。
確かにミニマムコードを書きテストしていれば私の実際にそくしたテストの結果が
相反しており、相反した環境の違いを考察したはずです。


環境の違いの考察は質問者が行うものではありません。
環境自体を質問者が質問時に提示するものです。
そして、回答者が考察を行うものです。
質問者が考察を行うつもりで環境の提示をしなければ、その質問は殆ど何も進展しません。勘違いをしないでください。

1ページ目を読み直してください。
貴方が環境の提示をしなかったから、何も進展していないでしょ?
回答者はエスパーじゃありません、貴方しか知らない事は決して解らないのです。
そして解らない事には回答を行うことが出来ません。
回答者が行えるのは、質問者が提示した目に見える事への回答だけです。

引用:

ところが次のヒントをいただいた時点で2.の単価の書き込み問題と気付きました。


最大の問題は、書き込みの問題ではありません。
貴方が提示すべき情報を提示しなかったことです。
エラーメッセージさえわかれば、ここにいる回答者の殆どの方は書き込みの問題だろうと予想が出来ます。
それこそ、最初のレスの時点でその為のヒントも出たとおもいます。
ヒントが出るのが遅かったのは、ヒントを出せる回答者がいなかったからではありません。
貴方がヒントを出すのに十分な情報を提示していなかったからです。

もう一度1ページ目を読み直してください。

答えを出す為に最低限必要なものは
1:何をしたいのか
2:どの様な結果が欲しいのか
3:どの様な事を行ったのか
4:その結果どのような起こったのか
特に1番と3番は重要です。
この4つが相手に伝える事が出来ていたとおもいますか?

もう1度1ページ目を読み直してください。

最後に、今回の貴方の質問の意図ってなんだったのですか?
自分には貴方が今回の問題を解決したいと思っている様には見えませんでした。
仕様であると誰かに保証して欲しかっただけでは有りませんか?

どうにも最初に欲しい答えを想定して話を進めようとしているようにしか見えませんです
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-23 08:23
 おそらく、使用しているユーザによって単価を見せたり隠したりする仕様だと思います。でも、日数と金額がわかれば、単価もわかるのでは?

あ〜!金額も隠すのか!!だから「設定もできない」だったの?

 金額はともかく、単価はエンド ユーザが設定可能なんですよね?だったら、見せたり見せなかったりという仕様がおかしいのでは?見せていないとき、何が設定されるのでしょう?

 あるいは、バインドさせながら、別の変数に取っておき、計算は別の変数を使うということもできますよね?
 なんにしても、じゃんぬさんがさりげなく指摘されていますが、検査もせずに CInt に回すのはどうかと思います。
コード:
class 入力フォーム {
    decimal p_単価;

    void バインドするときに() {
        p_単価 = バインドさせているもの;
    }

    void 計算するとき() {
        decimal 計算用単価 = p_単価;
        if (単価textBox.Text.Length > 0) {
            計算用単価 = Int32.Parse(単価textBox.Text);
        }
        // 面倒だからそのまま書いたけど、日数もチェックする
        金額textBox.Text = (Int32.Parse(日数textBox.Text) * 計算用単価).ToString();
    }
}


あ、C# じゃん。。。


ところで。
RUNさんが指摘されていることって、別のスレッドでまるくさんだったかな?とか、私からも指摘を受けていますよね?ちょっとずつ言葉は違うけど。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 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 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-25 18:26
引用:

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

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



Bingo! :wink:

[ メッセージ編集済み 編集者: iStation 編集日時 2007-11-22 16:11 ]


すみません、仕様だと書かれている文書を見つけられなかったので、出典を示していただけませんか?

検索ワード
「visible bind」
「visible バインド OR バインディング」
Control.Visible
DataSource.DataBind
Windows フォームでのデータ バインディング<microsoft.com>

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