質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1012閲覧

反映されない理由を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/07/24 06:03

編集2017/07/24 06:21

C#

1namespace WindowsFormsApplication1 2{ 3 public partial class Form1 : Form 4 { 5 Class1 c = new Class1(); 6 public Form1() 7 { 8 InitializeComponent(); 9 } 10 11 private void button1_Click(object sender, EventArgs e) 12 { 13 c.a(); 14 } 15 } 16 class Class1 17 { 18 public void a() 19 { 20 Form1 f = new Form1(); 21 f.label1.Text = "aaa"; 22 } 23 } 24} 25

Form1をnewしているからクリックしても変わらないのはわかったのですが、どうすればlabel1を変えれますでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

起動して実行されているForm1とは異なるインスタンスを生成して呼び出しているためです。

WindowsFormsApplicationであればProgramってクラスがあって、その中でApplication.Run(new Form1());のように呼び出されていると思います。
この時点でForm1がインスタンス化されて実行されます。→インスタンス1
次にサンプルのコードを追っていくと、button1_ClickからClass1のインスタンスであるcを通してaメソッドが呼び出されています。
このaの中ではForm1 f = new Form1();と記述してあり、新しいForm1クラスのインスタンスが生成されます。→インスタンス2

変更対象のラベルはインスタンス1にあるものですが、新しく生成したインスタンス2に対して処理を行っているため、意図した動作と異なっているのだと思います。

たぶん思考実験として質問されたものだと思いますが、単純にラベルの中身を変えたいならこうですね。

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 this.label1.Text = "aaa"; 4 }

thisは自分自身、つまりインスタンス1の実体を指します。

投稿2017/07/24 06:25

ShikaTech

総合スコア468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/24 06:29

やはりそういう事だったのですか・・・ インスタンス2に対して処理を行っているため意図した動作にならない。。。理解できました。 ちなみにこのソースでインスタンス1に対して処理を行いたい場合はどうするのでしょうか?
ShikaTech

2017/07/24 06:38

>ちなみにこのソースでインスタンス1に対して処理を行いたい場合はどうするのでしょうか? ラベルを変えたいだけであれば普通こんな記述はしませんが、可能かどうかで言えばこうやってできます。 ※未検証未動作なのでTypoってたらごめんなさい。 例1)メソッド引数 ```C# public partial class Form1 : Form { Class1 c = new Class1(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { c.a(this); } } class Class1 { public void a(Form1 f) { f.label1.Text = "aaa"; } } ``` 例2)コンストラクタ ```C# public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { new Class1(this).a(); } } class Class1 { private Form1 F{get;set;} pulibc Class1(Form1 f) { this.F = f; } public void a() { F.label1.Text = "aaa"; } } ```
退会済みユーザー

退会済みユーザー

2017/07/24 06:50

引数でこのようにしてあげると出来るのですね。。 とても勉強になりました。 ありがとうございました。
guest

0

cs

1namespace WindowsFormsApplication1 2{ 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void button1_Click(object sender, EventArgs e) 11 { 12 this.label1.Text = "aaa"; 13 } 14 } 15}

投稿2017/07/24 06:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問