オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。
この書き方の何がまずいのでしょうか?
namespace オブジェクト検索
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Control c = Controls["form2"];
if (c != null) { ((TextBox)c).Text += "*"; }
}
private void button2_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
Application.DoEvents();
}
}
}
ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。
No.3ベストアンサー
- 回答日時:
>こちらをまねて作りました。
私が聞いてるのは「何をやってるか」であって、どこのサイトを参考にしたかではありませんけど。
では、聞き方を変えましょうか。
>Control c = Controls["form2"];
は、何をやっているのか説明をお願いします。
>テキストボックスの存在を確かめるように、インスタンスしたフォームを確かめたかったです。
参考にされたサイトはちゃんと読まれていますか?
# 「インスタンスした」って何・・・
>フォームに配置されているコントロールを名前で探す
この「フォームに配置されているコントロール」というのはVisual Studioのフォームデザイナを使って配置しているコントロールという意味です。
自前で生成したコントロールは自前でForm#Controlsに追加しないと探せません。
フォームデザイナでフォーム上にコントロール配置して自動生成されるInitializeComponent()を確認してみてください。
その中にコントロールのインスタンス生成とForm#Controlsへの追加などの処理が書かれてます。
ちなみにやってみればわかりますがFormおよびその派生クラスのインスタンスはForm#Controlsには追加できません。
他にも
>Control c = Controls["form2"];
がbutton2_Click()で生成したForm2のインスタンスを取得してるつもりなら(先にも書いたようにFormのインスタンスはForm#Controlsに追加できないので取得は絶対にできないわけですが)
>if (c != null) { ((TextBox)c).Text += "*"; }
の「((TextBox)c).Text += "*"; 」は何をやってるんですか?
cのインスタンスはいったい何?
またbutton2_Click()が呼ばれる度にForm2のインスタンスが生成されますけど、それでいいんですか?
>> >Control c = Controls["form2"];
>> は、何をやっているのか説明をお願いします。
Control c = this.Controls["TextBox1"];
でTextBox1を探す事に上手くいっている実例を見つけたので、TextBox1ではなく、私の探したいニーズのあるform2に変えて書いてみました。
このソースを書く事によって、コンピューターが「何をやっているか」というのは私には説明出来ませんが、私の欲しい結果を生み出してくれていないということはカンずいていました。
>> 参考にされたサイトはちゃんと読まれていますか?
ちゃんと読むという言葉が、内容を理解するということであれば、今の私がよんで理解する度合いは回答者様よりもずいぶん少なく劣ると考えて頂いた方が良いと思います。この文章を書くため今一度目を通してみましたが、頂いた回答と照らし合わせて考えると、おそらく「Visual Studioを使用してすべてのコントロールを配置している場合は問題となることはまずないと思いますが、動的に自分でコントロールを配置した場合は、Nameプロパティを適当に設定」の文章の意味を把握出来ていなかったところが「ちゃんと読めていない」と判断される原因になったのではないかと考えました。
>>「インスタンスした」って何・・・
オブジェクトを実態化すること、もしくはオブジェクトそのものを指すみたいなかんじで解釈していました。
>>「((TextBox)c).Text += "*"; 」は何をやってるんですか?
テキストボックスに*を入れろ、という命令です。
これは、コピー前の原文をそのまま使用しています。
>>cのインスタンスはいったい何?
Control c = Controls["form2"];で、cが作られていると思いますので、cはform2のインスタンスと考えていました。
>>派生クラスのインスタンスはForm#Controlsには追加できません。
なるほど、ということは、結論このやり方でフォームの存在を確認する事はできないということですね!別の方法に切り替えて行きたいと思います。
ご説明に長文を書いて頂きありがとうございました。
問題はこちらの回答で解決できましたので、この回答をベストアンサーにしたいと思いますが、回答中の質問の返答を書かせて頂いていますので、場合によっては追記して頂けるのかと思います。
なので、少し時間をおいてベストアンサーを押させて頂きたいと思います。ありがとうございました。
No.6
- 回答日時:
form2への参照の仕方が間違っていることが原因ですね。
いくつか方法はありますが、form2をローカル変数にするのが解りやすいのでは?
namespace オブジェクト検索
{
private Form2 form2;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if(form2 == null){return;}
form2.Text += "*";
}
private void button2_Click(object sender, EventArgs e)
{
form2 = new Form2();
form2.Show();
Application.DoEvents();
}
}
}
No.5
- 回答日時:
オブジェクトの有無により動作を変えるというわけじゃありませんんが
button1のClickイベントハンドラを動的に追加するという方法もあります。
// イベントハンドラの削除については考慮していません。
// Form2#textBox1のアクセス修飾子はForm1からアクセスできるものにしておく必要があります。
// あくまでサンプルです。フォームから他のフォームのコントロールを直接操作するのはお勧めしません。
private void button2_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.Show();
button1.Click += (ls, le) => f.textBox1.Text = "*";
}
No.4
- 回答日時:
>このソースを書く事によって、コンピューターが「何をやっているか」というのは私には説明出来ませんが、私の欲しい結果を生み出してくれていないということはカンずいていました。
聞き方悪かったのかもしれませんが私が聞いてるのはコンピュータが何をやってるのかではなく、
「あなたがコンピュータに何をさせようとしてるのか」です。
コンピュータが何をやるのかはソースを読めばわかります、ですがそのソースの書き手が何をさせようとしてるのかはコメントでもない限り想像するしかないんです。
>>>「インスタンスした」って何・・・
>オブジェクトを実態化すること、もしくはオブジェクトそのものを指すみたいなかんじで解釈していました。
分からない事はなかったのですが、あなた独自の言い回しは質問される際には使用されない方がいいです。
それを読まされる方は暗号文を出されてるようなものですから。
>>>「((TextBox)c).Text += "*"; 」は何をやってるんですか?
>テキストボックスに*を入れろ、という命令です。
そうではなくて・・・
TextBoxのTextプロパティに"*"を入れようとしてるのはわかります。
ですけど、cのインスタンスはTextBoxなんですか?
違いますよね?
次の
>>>cのインスタンスはいったい何?
>Control c = Controls["form2"];で、cが作られていると思いますので、cはform2のインスタンスと考えていました。
でform2のインスタンス(form2のクラスはないのでForm2のインスタンスの事なんでしょうけど)って書かれていますし。
読んでるとコンピュータに何をさせようとしてるのかがわかっていないどころか、コンピュータに何をさせようとしてるのか自分でもわかっていない、そんな気がするんですけど・・・
No.1
- 回答日時:
>Control c = Controls["form2"];
これは何をやってるつもりなんでしょう?
http://dobon.net/vb/dotnet/control/findcontrolby …
こちらをまねて作りました。
テキストボックスの存在を確かめるように、インスタンスしたフォームを確かめたかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
CloseとDisposeの違い
Visual Basic(VBA)
-
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の変数を宣言する時、同時...
-
C#でオブジェクトの有無を取得する
-
変数名の付け方
-
C# インスタンスの破棄
-
インスタンス参照でアクセスで...
-
クラスのインスタンス名をクラ...
-
エンクロージングインスタンス
-
private static という変数の修飾
-
非staticフィールドを参照でき...
-
javaのクラスの作り方、エラー...
-
インスタンスを同じ名前で作成...
-
[Visual C#] 優先される処理に...
-
参照渡し
-
new演算子が、インスタンスの参...
-
SQLを連続発行する時の正しい(?...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
Labelコントロールに数字を代入...
-
staticと+=の意味を・・・
-
VBA 同じ名前のオブジェクトを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
オブジェクト参照がオブジェク...
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
変数の参照でエラーが出てしま...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
文字列を日付に変換でParseExce...
-
javaのクラスの作り方、エラー...
-
フォームの存在をチェックする方法
-
newしないインスタンス?実体化...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
-
他のファイルの変数参照
-
VB6.0で、DLLを動的に参照したい
おすすめ情報