ワークテキストボックスに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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
デザイン時のVisible=Falseは実行時に変更できない?
Visual Basic(VBA)
-
フォームの再読み込み
Visual Basic(VBA)
-
C#にて別クラスの関数を使いたい
C言語・C++・C#
-
-
4
C# 超初心者です。 this.Refresh();という文を使いたいです
C言語・C++・C#
-
5
DataGridViewの特定列に入力されている重複チェックをしたい
Visual Basic(VBA)
-
6
C# 配列の変数宣言について。
C言語・C++・C#
-
7
C#でボタンクリックをキャンセル
C言語・C++・C#
-
8
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
9
C#で、ある条件でFormが自動で閉じるプログラム
C言語・C++・C#
-
10
C# Form上に配置されたコントロールに重なるように透過GIF(PNG)を表示したい
C言語・C++・C#
-
11
C#テキストボックスの文字を配列にいれてその後表示する
C言語・C++・C#
-
12
コンボボックスでドロップダウンリストにしたときに・・・・
Visual Basic(VBA)
-
13
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
14
C#で空白行を削除する方法
その他(プログラミング・Web制作)
-
15
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
16
変数の前のビックリマークについて!
PHP
-
17
【C#】別フォームも同時に閉じるには?
C言語・C++・C#
-
18
同じソリューション内の別のプロジェクトのメソッド呼び出し
C言語・C++・C#
-
19
C# 点の描き方をおしえてください。
C言語・C++・C#
-
20
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
長方形を描いて、それを移動さ...
-
C#で別のFormへ複数の値を返そ...
-
Exception in thread "main" ...
-
JavaFXでの表内のチェックボッ...
-
配列の受け渡し
-
コンボボックスを使う時の警告
-
Processingでマウスクリックで...
-
ArrayListを使ったJavaコンパイ...
-
ボタンの複数割り当てについて
-
ボタンのイベントで異なるウィ...
-
【Java】画像表示が出来ない!
-
JPanel上のマウスの座標の取得
-
フェードアウト時にぶちっと画...
-
GetDIBits関数の使い方について
-
C# MouseHoverを何度も呼ぶには
-
webブラウザの戻る・進むボタン
-
大量のデータを読み込んで表示...
-
決められて時間が経過するとア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
Processingでマウスクリックで...
-
ボタンの複数割り当てについて
-
エンターキーを押すとOKボタン...
-
C# 矢印キーの取得
-
C# visibleプロパティをfalseに...
-
Thread.sleepのInterruptedExce...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
LVM_SETITEMSTATEでListViewの...
-
[C#.net]スレッド化された別フ...
-
GetDIBits関数の使い方について
-
C# 半角カナの文字化けについて
-
C# 親フォームで指定した値を...
-
javaアプレット repaintのタイ...
-
デスクトップマスコットのドラ...
-
C#で別のFormへ複数の値を返そ...
おすすめ情報
いろいろ調べましたが解決できないので
内部に変数として持たせ、連結したものをTextBoxに表示させることにしました。
kmeeさんの回答をうけて、再度試してみました。質問時のtextBox1と2はデータバインドしたテキストボックスです。
再度試したのは、非バインドのテキストボックスにデータが入るようにしたら
visibleプロパティに関係なく動作しました。
バインドしたテキストボックスではダメということでしょうか。
別の場所に補足を記入してしまいました。
kmeeさんの回答をうけて、再度試してみました。質問時のtextBox1と2はデータバインドしたテキストボックスです。
再度試したのは、非バインドのテキストボックスにデータが入るようにしたら
visibleプロパティに関係なく動作しました。
バインドしたテキストボックスではダメということでしょうか。
visible=true; で実行、各テキストボックスにデータが入っていることを確認。
visible=false; で実行し、MessageBoxで各テキストボックスの値を確認すると何も入っていない。
従って、連結用のテキストボックスにも何も入らない。
このような状況です。
よろしくお願いします。
マイクロソフトのサイトにそれらしき記載がありましたので試してみました。
visibleプロパティをいつ設定したかによって挙動が異なるようです。
デザイナーでfalseに設定した場合はハンドルされない。
従って、フォームをロード後に、コードでfalseに設定するとよい。
そのように修正したら、期待通りの動きとなりました。
すべて納得できたわけではありませんが、引き続き調べてみます。
いろいろありがとうございます。
ご参考にしてください。
https://social.msdn.microsoft.com/Forums/vstudio …