
ワークテキストボックスにtextBox1とtextBox2を配置し
textBox3に
textBox3.Text=textBox1.Text + textBox2.Text;
とした場合
textBox1とtextBox2のvisibleプロパティをtrueにしている場合は反映されるが
falseにすると反映されません。
AccessBVA等では経験したことがありませんが、VS2017C#でそのようなことが
あるのでしょうか。回避策はありますか。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
なるほど、確かに再現しました。
初めて知りました。class BindValue
{
public string Text1 { get; set; } = "hoge";
public string Text2 { get; set; } = "fuga";
public string Text3 { get; set; }
}
textBox1, textBox2, textBox3ともに、BindValueの各値にバインド。
public partial class Form1 : Form
{
private BindValue bindValue = new BindValue();
public Form1()
{
InitializeComponent();
bindValueBindingSource.DataSource = bindValue;
// コンストラクタまたはデザイナでfalseにすると、バインドは表示されるまで無効
//textBox1.Visible = false;
//textBox2.Visible = false;
}
protected override void OnCreateControl()
{
base.OnCreateControl();
// ここでfalseにすればバインドは動く
//textBox1.Visible = false;
//textBox2.Visible = false;
}
private void Form1_Load(object sender, EventArgs e)
{
// ここでfalseにすればバインドは動く
//textBox1.Visible = false;
//textBox2.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Visible = !textBox1.Visible;
textBox2.Visible = !textBox2.Visible;
}
private void button2_Click(object sender, EventArgs e)
{
//textBox3.Text = textBox1.Text + textBox2.Text;
var bindValue = bindValueBindingSource.DataSource as BindValue;
textBox3.Text = bindValue.Text1 + bindValue.Text2;
}
private void button3_Click(object sender, EventArgs e)
{
textBox1.Text = "test";
}
}
コンストラクタやデザイン上でVisible = False は、そもそも画面描画する必要ないでしょってことから、
OnCreateControl()で描画対象にならないので、バインドも自然とされないということのようですね。
ともすれば、InitializeComponentState()などのメソッドを用意してあげて、
OnCreateControl()またはLoadイベントで呼び出し、表示の初期値を変化させる、
という方法が最適そうですね。
場合によってコントロールの表示/非表示を切り替えるような動作をするならば、
どうせロジック内で切り替えているわけですから、そこまで苦になる実装ではないかと思います。
(むしろコード基準で、初期値は非表示かと認識できるので、悪くもない)
常に非表示のコントロールだとしたらデザイン上はWidth=0にするか、やはり上記コードで
Visible = falseにするかのどちらかですね。
(Width=0は視覚的に認識できないのでおすすめしませんが)
先に述べた理由で、バインドされていない値がTextBoxの値に設定されている場合があります。
textBox1.Text = "test"
bindValue.Text1 = "hoge"
の状態。
この状態があり得る実装を行っていると、意図しない値が制御される恐れもあります。
そのため、やはり内部で変数で持ち回る、という方法は避けた方がいいでしょう。
(さらに、持ち回る実装をするならバインドしている意味があまりない)
ありがとうございました。
小生も経験したことがない挙動だったので、悩んでしまいました。
naktakさんの仰る通り、内部の変数を持回るのはやめたほうがよいですね。
No.4
- 回答日時:
ちょっとよく分かりませんが、WinFormsを前提として試しています。
デザイナでデータバインドしている場合、デザイナでTextプロパティに値を設定しても、
以下のようなコードでは値は取得できません。
これはデータバインドを実施した瞬間、デザイナで指定しているText値は無効になるからです。
var bindValue = bindValueBindingSource.DataSource as BindValue;
textBox3.Text = bindValue.Text1 + bindValue.Text2;
上記を求めるならば、TextBoxのTextプロパティではなく、バインドしているオブジェクトの
初期値を設定すべきです。
上記はVisibleとは関係のない話ですが・・・。
具体的なコードはどうされているのですか?
それと後学のために、記載があったMicrosoftのページをご提示いただけると助かります。
No.3
- 回答日時:
class BindValue
{
public string Text1 { get; set; }
public string Text2 { get; set; }
public string Text3 { get; set; }
}
textBox1, textBox2, textBox3ともに、BindValueの各値にバインド。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Visible = !textBox1.Visible;
textBox2.Visible = !textBox2.Visible;
}
private void button2_Click(object sender, EventArgs e)
{
textBox3.Text = textBox1.Text + textBox2.Text;
}
}
単純な実装の、これでは再現しません。
データバインドのオブジェクトを直接操作する形を取っても再現しません。
public partial class Form1 : Form
{
private BindValue bindValue = new BindValue();
public Form1()
{
InitializeComponent();
bindValueBindingSource.DataSource = bindValue;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Visible = !textBox1.Visible;
textBox2.Visible = !textBox2.Visible;
}
private void button2_Click(object sender, EventArgs e)
{
var bindValue = bindValueBindingSource.DataSource as BindValue;
textBox3.Text = bindValue.Text1 + bindValue.Text2;
}
}
よって、何らかしらが邪魔して値が消されていたりするのでは。
デバッグでタイミングごとにテキスト値を確認してみてはいかがでしょう。
ムリヤリ変数に入れて云々は、根本的な解決ではないのでバグの温床になりうるでしょう。
No.2
- 回答日時:
反映されませんというのは、どのように反映されないのでしょう?
もともとtestという文字が設定されていたら、その文字が消えるのか、無反応なのか。
視覚的には変化しているが、バインド値を取得すると変わってないとか。
No.1
- 回答日時:
似たようなのは何度もやってますけど、VisibleによってTextの内容が変わるようなことはなかったですよ。
textBox3.Text=textBox1.Text + textBox2.Text
このコード、どこに書いてありますか?
例えば、 textBox1.Leaveイベントのハンドラに書いてあったら、textBox1.Visible=Falseのときは
textBox1のフォーカスが当らない
→フォーカスがあたらなければ、Leaveすることもない
→Leaveイベントは発生しないから実行されない
ということになりますし、
textBox1.TextChamgedイベントのハンドラに書いてあって、
textBox1.text="A";
textBox2.text="B";
でTextChagedイベントでtextBox3を書き換えたあとで
textBox3.text="";
等と上書きしてしまっているとかもありそうです。
ありがとうございます。お世話になります。
buttonのクリックイベントに書いているのですが
textBox1.Text とtextBox2.Textにはテーブルの検索結果として2つの列のデータが
入ります。
textBox3.Textに連結したものを表示させたいのですが質問のようなことになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- Excel(エクセル) Excelのtextboxへの入力で小数点以下に0が続く場合でも正しく表示したい 3 2022/04/11 13:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/20 16:59
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/20 14:46
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/20 10:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAアプレットのサウンド機能...
-
Javaのアプレットについて
-
getConnection( )メソッドの戻り値
-
フェードアウト時にぶちっと画...
-
負の数を取得するには?
-
GOF本のStrategyのJava版での質...
-
javaの課題プログラムでどうし...
-
Androidでこのエラーを解決した...
-
画像がうまく表示されません
-
javaの同期について
-
フレームを表示できないのです...
-
コードがよくわかりません。
-
<identifier>エラーについて
-
C#でのDLLのメソッドの作り方
-
プログラムミス?
-
インターフェイスは何故必要か
-
javaの同期について
-
C#クラスについて教えてください
-
テキストフィールドに入力した...
-
javaのrepaint()について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C#で別のFormへ複数の値を返そ...
-
C# WinForm のDataGridView Cel...
-
C# visibleプロパティをfalseに...
-
C# 矢印キーの取得
-
C# MouseHoverを何度も呼ぶには
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C#でキーイベントが発生しない...
-
C# DataGridView列カスタマイズ
-
C#から、C++で作成したdll内の...
-
画像ファイル操作方法
-
エンターキーを押すとOKボタン...
-
スレッド動かず
-
Java コレクション・ジェネリク...
-
なぜエラーになるのかがわかり...
-
マウスクリックで別のスレッド...
-
参照されない
おすすめ情報
いろいろ調べましたが解決できないので
内部に変数として持たせ、連結したものをTextBoxに表示させることにしました。
kmeeさんの回答をうけて、再度試してみました。質問時のtextBox1と2はデータバインドしたテキストボックスです。
再度試したのは、非バインドのテキストボックスにデータが入るようにしたら
visibleプロパティに関係なく動作しました。
バインドしたテキストボックスではダメということでしょうか。
別の場所に補足を記入してしまいました。
kmeeさんの回答をうけて、再度試してみました。質問時のtextBox1と2はデータバインドしたテキストボックスです。
再度試したのは、非バインドのテキストボックスにデータが入るようにしたら
visibleプロパティに関係なく動作しました。
バインドしたテキストボックスではダメということでしょうか。
visible=true; で実行、各テキストボックスにデータが入っていることを確認。
visible=false; で実行し、MessageBoxで各テキストボックスの値を確認すると何も入っていない。
従って、連結用のテキストボックスにも何も入らない。
このような状況です。
よろしくお願いします。
マイクロソフトのサイトにそれらしき記載がありましたので試してみました。
visibleプロパティをいつ設定したかによって挙動が異なるようです。
デザイナーでfalseに設定した場合はハンドルされない。
従って、フォームをロード後に、コードでfalseに設定するとよい。
そのように修正したら、期待通りの動きとなりました。
すべて納得できたわけではありませんが、引き続き調べてみます。
いろいろありがとうございます。
ご参考にしてください。
https://social.msdn.microsoft.com/Forums/vstudio …