みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#でオブジェクトの有無を取得する

オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。
この書き方の何がまずいのでしょうか?


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を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。

投稿日時 - 2014-06-29 01:56:41

QNo.8657471

すぐに回答ほしいです

質問者が選んだベストアンサー

>こちらをまねて作りました。

私が聞いてるのは「何をやってるか」であって、どこのサイトを参考にしたかではありませんけど。
では、聞き方を変えましょうか。

>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のインスタンスが生成されますけど、それでいいんですか?

投稿日時 - 2014-06-29 11:00:09

お礼

>> >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には追加できません。
なるほど、ということは、結論このやり方でフォームの存在を確認する事はできないということですね!別の方法に切り替えて行きたいと思います。

ご説明に長文を書いて頂きありがとうございました。
問題はこちらの回答で解決できましたので、この回答をベストアンサーにしたいと思いますが、回答中の質問の返答を書かせて頂いていますので、場合によっては追記して頂けるのかと思います。
なので、少し時間をおいてベストアンサーを押させて頂きたいと思います。ありがとうございました。

投稿日時 - 2014-06-29 12:59:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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();
}
}
}

投稿日時 - 2014-06-30 11:12:30

ANo.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 = "*";
}

投稿日時 - 2014-06-29 15:14:56

ANo.4

>このソースを書く事によって、コンピューターが「何をやっているか」というのは私には説明出来ませんが、私の欲しい結果を生み出してくれていないということはカンずいていました。

聞き方悪かったのかもしれませんが私が聞いてるのはコンピュータが何をやってるのかではなく、
「あなたがコンピュータに何をさせようとしてるのか」です。
コンピュータが何をやるのかはソースを読めばわかります、ですがそのソースの書き手が何をさせようとしてるのかはコメントでもない限り想像するしかないんです。

>>>「インスタンスした」って何・・・
>オブジェクトを実態化すること、もしくはオブジェクトそのものを指すみたいなかんじで解釈していました。

分からない事はなかったのですが、あなた独自の言い回しは質問される際には使用されない方がいいです。
それを読まされる方は暗号文を出されてるようなものですから。

>>>「((TextBox)c).Text += "*"; 」は何をやってるんですか?
>テキストボックスに*を入れろ、という命令です。

そうではなくて・・・
TextBoxのTextプロパティに"*"を入れようとしてるのはわかります。
ですけど、cのインスタンスはTextBoxなんですか?
違いますよね?

次の

>>>cのインスタンスはいったい何?
>Control c = Controls["form2"];で、cが作られていると思いますので、cはform2のインスタンスと考えていました。

でform2のインスタンス(form2のクラスはないのでForm2のインスタンスの事なんでしょうけど)って書かれていますし。

読んでるとコンピュータに何をさせようとしてるのかがわかっていないどころか、コンピュータに何をさせようとしてるのか自分でもわかっていない、そんな気がするんですけど・・・

投稿日時 - 2014-06-29 14:12:28

ANo.2

「うまくいかない」とは, 具体的にはなにがどう「うまくいかない」?

投稿日時 - 2014-06-29 02:48:34

お礼

ボタン(2)を押してフォームを作った後で、ボタン(1)を押しても※マークがテキストボックスに入らない。っという事です。

投稿日時 - 2014-06-29 09:27:24

ANo.1

>Control c = Controls["form2"];

これは何をやってるつもりなんでしょう?

投稿日時 - 2014-06-29 02:43:08

お礼

http://dobon.net/vb/dotnet/control/findcontrolbyname.html

こちらをまねて作りました。
テキストボックスの存在を確かめるように、インスタンスしたフォームを確かめたかったです。

投稿日時 - 2014-06-29 09:28:18

あなたにオススメの質問