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

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

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

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

Q&A

解決済

2回答

1345閲覧

チェックボックスの状態をボタンクリック時に別のメソッドを呼び出して取得したい。

takaracup

総合スコア1

C#

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

0グッド

0クリップ

投稿2020/06/26 02:08

編集2020/06/26 02:49

前提・実現したいこと

フォーム上にある10個のチェックボックスの状態をボタンクリック時に別のメソッドを呼び出し取得したいです。
呼び出すメソッドにはfor文で10個のチェックボックスの状態を取得し、チェックされた項目に対しいろいろな処理をさせます。

発生している問題・エラーメッセージ

チェックした状態でボタンをクリックしてもchecked=falseになってしまいます。

該当のソースコード

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1 obj = new Form1(); obj.test(); } private void test() { MessageBox.Show(Convert.ToString(checkBox1.Checked)); } }

試したこと

チェックボックスとボタンだけを設置したフォームでテストしましたが同じくFalseになってしまいます。
ボタンクリックメソッドで取得した時は正常に状態を取得できました。
まだ初心者なので用語等間違っていたらすみません。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/26 02:18

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。
takaracup

2020/06/26 02:24

ご指摘ありがとうございます。 修正しました。 初めての為消してしまいました。
退会済みユーザー

退会済みユーザー

2020/06/26 02:34 編集

button1_Click の中のコードが変です。2 行とも削除(またはコメントアウト)して、代わりに以下のようなコードを入れてデバッガで result がどうなるか調べてみてはいかがですか。 bool result = this.checkBox1.Checked;
takaracup

2020/06/26 02:43

ありがとうございます。 resultはtrueになりましたがtestメソッドが呼び出されません。 あと書き忘れてしまいましたが、本当はチェックボックスを10個用意して全ての状態をtestメソッドでforを使い取得して処理しようとしています。 質問に追記します。
退会済みユーザー

退会済みユーザー

2020/06/26 02:53

> resultはtrueになりましたがtestメソッドが呼び出されません。 上の私のコメントの通り「2 行とも削除(またはコメントアウト)」したのであればそうなるのは当然ということは分かりますよね。test() を呼び出すならそのコードを書かないと。その場合書くのは obj.test(); ではないですよ。button1_Click の中のコードに test(); を追加して以下のようにしたらどうなりますか? bool result = this.checkBox1.Checked; test(); 質問者さん、基本的なところが分かってない=掲示板で話が通じない・・・という状況のようです。質問する前に、話が通じる程度には勉強が必要かと思います。
takaracup

2020/06/26 04:42

勉強が必要なのは確かですがまだ初心者って書いてありますよね? 2行削除してbool result = this.checkBox1.Checked;でどうですかって言われてobj.test();ではなくtest();を足す初心者がいますか? ただ、教えてくださったので感謝致します。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/06/26 05:54

> 2行削除してbool result = this.checkBox1.Checked;でどうですかって言われてobj.test();ではなくtest();を足す初心者がいますか? 初心者と言っても色々なレベルの人がいますから、「button1_Click の中のコードが変です」と言われたのだから、何が変なのかに気付いて、test(); で試す人は多々いると思いますけど。 そもそも、あなたが質問に書いたコードでは、第三者は CheckBox が存在しているのかどうかも分からないのは認識してますか? だから「デバッガで result がどうなるか調べてみてはいかがですか」と書いたのです。で、あなたは「resultはtrueになりました」と確認してくれたのですよね。 そしたら、次のステップは、「button1_Click の中のコードが変です」と言っているのですから、あなたが何が変なのかを考えて問題に気が付くか、考えても分からなければ聞いてくると思っていたのですが、そういうのはあなたには期待しすぎでしたか?
takaracup

2020/06/26 07:15

試したことの欄読んでますか? チェックボックスとボタンだけ配置したって書いてありますし ボタンクリックメソッド内ではtrueになるのは既に確認してます。 >CheckBox が存在しているのかどうかも分からない チェックする為だけに存在するチェックボックスのコードをどこになにを書くんですか? >考えても分からなければ聞いてくると思っていたのですが 色々考えてわからなかったから質問してるんです。 test();で呼び出せることを知っていたらそもそもこんな質問しません。 あなたレベルの人だとそんなことも知らないなんて想像もつかなかったでしょうね。 期待に応えられずすみませんでした。
退会済みユーザー

退会済みユーザー

2020/06/26 08:27 編集

> 試したことの欄読んでますか? 読みましたよ。でも「チェックボックスとボタンだけを設置したフォームでテストしましたが同じくFalseになってしまいます」と書いてありますね。それをどう読めというのですか? 自分はちゃんと CheckBox が配置されているとは思えなかったですけど。アップされているコードもあり得ないことをしているし、何か想像の斜め上のことをやっているのではと疑がわざるを得ません。だから「デバッガで result がどうなるか調べてみてはいかがですか」と書いたのですよ。その答えで CheckBox は button1_Click で Checked が取得できるように配置されているようだとやっと確認できた次第です。自分はエスパーではないので・・・ 一度 https://teratail.com/help/question-tips を読んでいただければと思います。
takaracup

2020/06/26 13:07

試したことを読んでもチェックボックスが配置されてるか疑う人がいるんですね。捻くれてますね。 チェックボックスとボタンを設置したと書いてあるのに「デバッガで result がどうなるか調べてみてはいかがですか」と書いてチェックボックスの存在を確認しようとしてたなんて想像の斜め上を行ってて気づきませんでした。 他の回答者さんは理解して頂いてるみたいなのでエスパーなんですかね。 >アップされているコードもあり得ないことをしているし ボタンをクリックして別のメソッドを呼び出すのはそんなにあり得ないんですか? 教えてくれる人が近くいないし、やりたいことを全部ネットで調べて勉強しながら作ってるのでおかしいコードを書いてるかもしれませんね。 自分なりに伝わりやすいようにやりたいところだけのコードを作って質問したんですけど伝わらない事もあるんだと勉強になりました。 ありがとうございます。 もう時間の無駄なので返事はしません。 一人で書き込んでて下さい。
退会済みユーザー

退会済みユーザー

2020/06/26 14:47

> 試したことを読んでもチェックボックスが配置されてるか疑う人がいるんですね。捻くれてますね。 疑ってかかって、きちんと確認しなければ、迷走するのは初心者との話ではよくあることです。 あなた自身が「まだ初心者なので」とか言っているんだからもっと謙虚になった方が良いと思いますよ。そういう態度であなたが何も得することはないはず。 > 他の回答者さんは理解して頂いてるみたいなのでエスパーなんですかね。 他の人の回答は 2020/06/26 12:16 と 2020/06/26 12:20 で、私が下のレスを返したのは 2020/06/26 11:53 ということは認識してますか? > 上の私のコメントの通り「2 行とも削除(またはコメントアウト)」したのであればそうなるのは当然ということは分かりますよね。test() を呼び出すならそのコードを書かないと。その場合書くのは obj.test(); ではないですよ。button1_Click の中のコードに test(); を追加して以下のようにしたらどうなりますか? > bool result = this.checkBox1.Checked; > test(); 上のレスで解決しているはずなのですが・・・ 他の人の回答は基本私のレスと同じことを言ってますよ。 もう一回言いますが、質問者さん、基本的なところが分かってない=掲示板で話が通じない・・・という状況のようです。質問する前に、話が通じる程度には勉強が必要かと思います。 > もう時間の無駄なので返事はしません。一人で書き込んでて下さい。 そういうのは逃げというのでは?
guest

回答2

0

Formをnewしているのが原因です。
今の実装は、チェック状態の自分自身(this)ではなく、
newした別のインスタンスの checkBox1 を評価している為です。

c#

1Form1 obj = new Form1(); 2obj.test(); 34test();

投稿2020/06/26 03:20

InNELV

総合スコア31

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

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

takaracup

2020/06/26 04:28

test()だけで呼び出せるの知りませんでした! メソッドの呼び出しで調べてもこの方法しか出てこなくて。。。 ありがとうございました!
InNELV

2020/06/26 06:21

補足すると、test()だけで呼び出せるのは、クラス内のメソッドだからです。 他クラスのメソッドを呼ぶ場合は、初めのコードのように ClassA hoge = new ClassA() して、hoge.test() でOKです。 __メソッドがどのクラスのものなのか?__ を意識すると良いです。
takaracup

2020/06/26 13:21

C#ではメソッド名.()だけでは呼び出せない!って記事をどっかで見たような気がしてtest()だけでは使えないと思ってました。 他クラスから呼び出す場合のことだったのですね。 ありがとうございます。
guest

0

ベストアンサー

Form1 obj = new Form1();
obj.test();

あなたは,クリックされたボタンを有するフォームとは別の新しいフォームを作成し,その新しい別のフォームのtest()をコールしました.
新しい別のフォーム上にあるチェックボックスは,ボタンが押されたフォーム上のそれとは全く別の個体です.
その別個体たるチェックボックスの(初期)状態が「チェックされていない」側なのでしょう.

投稿2020/06/26 03:16

fana

総合スコア11632

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

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

fana

2020/06/26 03:19

なんだ? 入力した文章と表示が違うぞ? 「編集」を押すと正しい状態になっているし……??? 仕方ないので,切れた文章をここに書く. その別個体たるチェックボックスの(初期)状態が「チェックされていない」側なのでしょう.だからfalseとなる.
takaracup

2020/06/26 04:24

わかりやすい解説ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問