オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。
この書き方の何がまずいのでしょうか?
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.1
- 回答日時:
>Control c = Controls["form2"];
これは何をやってるつもりなんでしょう?
http://dobon.net/vb/dotnet/control/findcontrolby …
こちらをまねて作りました。
テキストボックスの存在を確かめるように、インスタンスしたフォームを確かめたかったです。
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.4
- 回答日時:
>このソースを書く事によって、コンピューターが「何をやっているか」というのは私には説明出来ませんが、私の欲しい結果を生み出してくれていないということはカンずいていました。
聞き方悪かったのかもしれませんが私が聞いてるのはコンピュータが何をやってるのかではなく、
「あなたがコンピュータに何をさせようとしてるのか」です。
コンピュータが何をやるのかはソースを読めばわかります、ですがそのソースの書き手が何をさせようとしてるのかはコメントでもない限り想像するしかないんです。
>>>「インスタンスした」って何・・・
>オブジェクトを実態化すること、もしくはオブジェクトそのものを指すみたいなかんじで解釈していました。
分からない事はなかったのですが、あなた独自の言い回しは質問される際には使用されない方がいいです。
それを読まされる方は暗号文を出されてるようなものですから。
>>>「((TextBox)c).Text += "*"; 」は何をやってるんですか?
>テキストボックスに*を入れろ、という命令です。
そうではなくて・・・
TextBoxのTextプロパティに"*"を入れようとしてるのはわかります。
ですけど、cのインスタンスはTextBoxなんですか?
違いますよね?
次の
>>>cのインスタンスはいったい何?
>Control c = Controls["form2"];で、cが作られていると思いますので、cはform2のインスタンスと考えていました。
でform2のインスタンス(form2のクラスはないのでForm2のインスタンスの事なんでしょうけど)って書かれていますし。
読んでるとコンピュータに何をさせようとしてるのかがわかっていないどころか、コンピュータに何をさせようとしてるのか自分でもわかっていない、そんな気がするんですけど・・・
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.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();
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
生成したインスタンスを削除す...
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
エクセル(複数インスタンス)...
-
インスタンスを同じ名前で作成...
-
外部ライブラリの動的参照によ...
-
他のファイルの変数参照
-
データベースから日付型を取得...
-
Eclipse3でVisualEditorが起動...
-
c++の課題で クラスのオブジェ...
-
VB.netで標準モジュールからフ...
-
newしないインスタンス?実体化...
-
javaのクラスの作り方、エラー...
-
C#「オブジェクト参照が必要で...
-
C#において、同じインスタンス...
-
VB6.0で、DLLを動的に参照したい
-
C# インスタンスの破棄
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
エクセル(複数インスタンス)...
-
他のファイルの変数参照
おすすめ情報