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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

4回答

4260閲覧

オブジェクトを別のメソッドにオブジェクトとして渡すことは可能ですか?

neji-thon

総合スコア7

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

1グッド

1クリップ

投稿2021/06/05 16:52

編集2021/06/07 01:29

※C#独学中で、おかしな事を言ってると思います。初心者の方は参考にしないほうがいいです。

複数のオブジェクトごとに同じ動作をさせたいのですが、SubMethodごとにobjが異なり、objを動的に渡す方法が不明なため、MainMethodにまとめられず、各SubMethod内にて、obj名だけが異なる、コードを書き、SubMethodでの重複コードが大量発生しています。

テキストのような値であれば引数で渡せますが、オブジェクトそのものを渡す方法がわかりません。
無理やりテキストでオブジェクトの名前を渡すと、プロパティが反応しなくなるため、どうしたら良いでしょうか?

■環境
C#
Windowsフォーム
.Net FrameWordks 4.7.2

C#

1 private void MainMethod() 2 { 3 obj.Text = "hoge"; //hogeの値はstringで引数で渡せますがobj自体の渡し方が不明 4 obj.property();  //objを無理やりstringで渡したらpropertyが機能しなくなる。 5 } 6 7 private void SubMethod(object sender, EventArgs e) 8 { 9 MainMethod(); //SubMethodは数が多いため、作業はMainMethodに渡したい 10 } 11

お分かりになる方、そもそもの考え方がおかしい場合、サンプルのコードは一切無視しても問題ございませんので、ご指摘や、こういった場合の対処法などご教示お願いします。


コメントくださった皆様、質問内容が固まっていないようで大変申し訳ありませんでした。
1か月以上、何時間も調べてもわからず、まだ理解に乏しい中で、簡潔に質問しようとしたのが間違いでした。

まだ具体的に質問できるか心配ですが、もう少し具体的なコードを書きます。

C#

1 private void checkBox21_CheckedChanged(object sender, EventArgs e) 2 { 3 CheckBox chkBox = (CheckBox)sender; 4 if (chkBox.Checked) 5 { 6 DialogResult dialog = MessageBox.Show("browser1を今すぐ停止しますか?", "ご確認ください", MessageBoxButtons.YesNo); 7 if (dialog == DialogResult.No) 8 { 9 checkBox21.Checked = false; 10 return; 11 } 12 browser1.Dispose(); 13 checkBox21.Text = "起動"; 14 } 15 else 16 { 17 checkBox21.Text = "停止"; 18 StartUpMethod(); 19 } 20 21 } 22

状況としては、まず、ツールの中で複数のブラウザが起動している状態になっています。
そのブラウザをそれぞれ、停止と起動を制御したく、チェックボックスをトグルボタンに変えて、実際に停止と起動は問題なく動作は出来ているのですが、checkBox21_CheckedChangedのようなメソッドすべての中身に停止と起動の処理が書かれており、困っている状態なのでした。

上記の起動と停止の処理に関して、checkBox21やbrowser1といったオブジェクト(インスタンスと伝えた方がよかったのでしょうか。。)を渡す、どのブラウザでも停止と起動をしてくれるメソッドを一つ用意したいというのが目的でした。

それができたら、都度、checkBox21_CheckedChangedやcheckBox22_CheckedChangedのようなメソッドの中からは、checkBox21やbrowser1といった自分のオブジェクト名を処理のメソッドに渡すだけでよくなり、コードが減って、見やすくて管理もしやすいのかなと思っています。

ご迷惑をおかけしてすいません。
お手数ですが、改めてご教示いただけますと幸いです。

よろしくお願いします。


ご迷惑おかけしております。
len_soukoさんにご教示いただき、
checkBox.NameにてMainMethod側でチェックボックスの名前を確認できて、
checkBox.TextにてMainMethod側でチェックボックスのテキストを指定できました!

ブラウザの方は、
WebView2 WebView2objでオブジェクトを引数で渡してあげて
WebView2obj.Dispose()で実際に実行できました。

実は、まだ以下2つの要素も、それぞれ、毎回違うので動的に引数で渡したいと思っている次第です。

・StartUpMethodのメソッド名そのもの
・Properties.SettingsのUse_BRNameの部分

以下が完全なコードです。

C#

1private void MainMethod(CheckBox checkBox, WebView2 WebView2obj, string BRName) 2{ 3 if (checkBox.Checked) 4 { 5 if (Properties.Settings.Default.Use_BRName == "ON") // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< 6 { 7 DialogResult dialog = MessageBox.Show("${BRName}を今すぐ停止しますか?", "ブラウザ停止確認", MessageBoxButtons.YesNo); 8 if (dialog == DialogResult.No) 9 { 10 checkBox.Checked = false; 11 return; 12 } 13 Properties.Settings.Default.Use_BRName = "OFF"; // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< 14 Properties.Settings.Default.Save(); 15 WebView2obj.Dispose(); // ←ここは動的に引数で渡せました! 16 checkBox.Text = "起動"; 17 } 18 } 19 else 20 { 21 if (Properties.Settings.Default.Use_BRName == "OFF") // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< 22 { 23 Properties.Settings.Default.Use_BRName = "ON"; // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< 24 Properties.Settings.Default.Save(); 25 checkBox.Text = "停止"; 26 StartUpMethod(); // ←このメソッドの名前を動的に引数で渡したいです>< 27 } 28 } 29}

お手数ですが、ご教示いただけますと幸いです。
よろしくお願いします。

hihijiji👍を押しています

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

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

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

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

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

asm

2021/06/05 17:34

残念ながら何がしたいのかがさっぱり分かりません。 > MainMethodにまとめられず、各SubMethod内にて、obj名だけが異なる、コードを書き、SubMethodでの重複コードが大量発生しています。 とりあえず、現状の重複コードの例をお願いします。
gentaro

2021/06/05 19:25

一言一句びっくりするほど意味不明すぎる。 「複数のオブジェクト」「SubMethodごと」「objが」「obj名だけが異なる」など、定義が曖昧で、あなたにしかわからない言葉で説明するんじゃなく、実際にいま組んでいるコードに基づいたサンプルを提示し、それについて説明して。
退会済みユーザー

退会済みユーザー

2021/06/05 23:15

「値型」と「参照型」の違いとか理解してますか? もし答えが No なら、まずその辺りを勉強すると多少先が見えてくると思います。
退会済みユーザー

退会済みユーザー

2021/06/05 23:42

一度読んでみてください→ https://teratail.com/help/question-tips そこに書いてありますが、 人に質問をするには、自分が何を尋ねたいかを知っている必要があります。 これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。 ・・・ができることが (もちろんここに書いてないことは知り得ない第三者が読んでわかる内容で)、ここのような文章でやり取りするサイトで質問するには必要です。
len_souko

2021/06/06 02:08

obj.property(); C#の話ですか? C#のプロパティへのアクセスは {インスタンス名}.{プロパティ名} の形で使用します※staticは質問と関係ないので除外 メソッドの様な形「インスタンス名.プロパティ名()」で使用しません 質問にあるobjとは何ですか? クラスですか?インスタンスですか? SubMethodはコードからイベントハンドラだとは思いますがあっていますか? 質問者さんの頭の中もしくは手元のコードを見ない限りは現状が理解できない質問文であることを理解してください 例えば、僕が「ジュースを買おうと思ったけど買えなかった助けて」と書いたとしてその文章だけで僕がどのような状況でどういう理由でジュースが買えなかったか分かりますか?ここで自販機が壊れてたもしくは欲しいジュースが売り切れだったと考える人が多いと思いますが、実は無人島や異世界に居るので買い物という事自体が実行不可能であるとか何者かに両手両足を切断されて音声入力で質問を投げているとかが本当の理由だった場合は解決可能な回答にたどり着けませんよね 上記は極端な例ですがあなたが関係ないと判断していることが解決の切っ掛けとなるかもしれませんので少なくとも質問中に登場するものに関して第三者に何なのか分かる程度の情報は載せてください
neji-thon

2021/06/06 03:44

>みなさま ご迷惑おかけし申し訳ありません。実際のコードを少し追加してみました。 >asmさん さっぱりですいません。。あらためまして、何かおわかりでしたらご教示のほどよろしくお願いします。 >gentaroさん お恥ずかしい限りです。ご指摘ありがとうございます。サンプルと説明を改めてみました。よろしくお願いします。 >SurferOnWwwさん 毎度ありがとうございます。「値型」と「参照型」もあいまいでした。この機会にもう一度勉強してみます。質問の仕方も勉強ですね。すみません。。 >len_soukoさん 基礎がわかってない状態で言葉を並べてしまって申し訳ありません。説明するのに、ブラウザの起動をする所からコードを書いていると、正しいコードではなかった場合に別の話に発展する可能性も懸念して、なるべくピンポイントで質問をしようとしたのが間違いでした。改めてよろしくお願いします。
Zuishin

2021/06/06 04:02

チェックボックスがたくさんあり、そのチェックボックス一つ一つに checkBoxN_CheckedChanged があるということかな? そこでそれぞれに違う browser のインスタンスを処理しているので似たようなコードをたくさん書かなきゃいけないと。 そこで考えたのが checkBoxN_CheckedChanged から MainMethod を呼ぶことだけど、browser のインスタンスをどうやって MainMethod に渡せば良いかわからないということ?
Zuishin

2021/06/06 04:05

つまりこういうことがしたいということ? private void MainMethod(Checkbox checkbox, Browser browser) { } private void checkBox21_CheckedChanged(object sender, EventArgs e) { MainMethod((CheckBox)sender, browser); }
neji-thon

2021/06/06 04:09 編集

>Zuishinさん はい!!!!!!そうです!!! すごい。。ありがとうございます!browserと、checkboxも毎回違うのでそれも渡してあげたいと思ってます。と書いてる間に具体的なコードを。。ありがとうございます! ちょっとやってみます。
dodox86

2021/06/06 04:07

どうもいまだに良く分からない点がありますが、「複数のブラウザ」と言っているのは、ご提示のコードで言うとbrowser1で、それがチェックボックス(トグルボタンに変えた?)分の個数存在するということなのでしょうか。browserも、checkBoxも、それぞれ1対1に対応しているのですか? 例えば「browserが10個あったらcheckBoxも10個ある」のような。「オブジェクト名」と言っているのは、Windows FormsのControlクラスのNameプロパティのことでしょうか。
neji-thon

2021/06/06 04:15

>dodox86さん コメントありがとうございます。 >ご提示のコードで言うとbrowser1で、それがチェックボックス(トグルボタンに変えた?)分の個数存在するということなのでしょうか はい。それぞれ1対1で存在しています。 >「オブジェクト名」と言っているのは、Windows FormsのControlクラスのNameプロパティのことでしょうか。 「はい。Nameプロパティです。」と断言できるほど理解できてないのですが、チェックボックスとブラウザが複数あるうちのそれらです。。すいません。うまく書けず恐縮ですが、引き続きよろしくお願いいたします。
dodox86

2021/06/06 04:16 編集

ああ、いえ、質問者さんの方で解決しそうであれば結構です。上記コメントは無視してください。
neji-thon

2021/06/06 04:16

>dodox86さん 承知しました!ご丁寧にありがとうございます!
dodox86

2021/06/07 01:37

@質問者neji-thonさん [2021/06/07 10:29 - 2つの要素の修正]の質問修正を読んで: > 実は、まだ以下2つの要素も、それぞれ、毎回違うので動的に引数で渡したいと思っている次第です。 後出しで質問の条件を増やすのは止めましょう。閲覧している方も含め、既に回答していただいている回答者さんの負担が増えるばかりです。
neji-thon

2021/06/07 02:02

>dodox86さん すいません。お手数ばかりおかけしてる状態ですね。 見てる方にもよろしくない状況になってるので反省します。
fana

2021/06/07 08:12

現状どんな形になってるのか知りませんが, チェックボックス次第でやるべきことが異なる「共通でない」処理については,共通処理内に突っ込まずとも,素直に > checkBox21_CheckedChangedやcheckBox22_CheckedChangedのようなメソッドの中 に書けば良いんじゃないですかね.
neji-thon

2021/06/18 23:44

>fanaさん コメントありがとうございました! そうですね。共通な処理が多かったのでまとめたかったです。でまとめられました! 皆様に感謝えす。
guest

回答4

0

ベストアンサー

そもそもの質問タイトルの「オブジェクトを別のメソッドにオブジェクトとして渡すことは可能ですか?」に対しての回答が忘れていましたので追記します
「はい、できます」詳細は回答にあるBrowser起動停止切り替え(CheckBox checkBox, WebBrowse browser)のような形でメソッドを定義し、呼び出す際にも普通に引数として渡せば使えます
型が違う場合はクラスの継承やインターフェースの実装に関して理解できるまでは同じ方じゃないと引数に渡せないと思っておいてください
クラスの継承やインターフェースの理解が進めば違う型でも引数に渡せる場合もあり、その条件は何やという所が理解できてると思います

2021/06/06 12:18に追記された情報を見て・・
僕のエスパー力ではまだまだだったようですな
インターフェースの所の説明は今回は関係なさそうですが、現時点でもわからないStartUpMethod();が判明した場合は必要となる可能性もあります

チェックボックスと対になるブラウザコントロールが何かというのは名前からは拾えないと思いますので、デザイナ側でどのチェックボックスとどのブラウザコントロールがついになるのかを確認してください
プロパティウィンドウで確認できます
次に、対となるチェックボックスの名称をキーとしてブラウザコントロールを辞書として登録します
※一つ目は質問文のコードから、二つ目以降は単純に番号をインクリメントしているだけなので、実際の名前を当ててください
また、Dictionarynameof()についてもコピペで済まさずにきちんと調べてください

c#

1// formクラスのプライベートフィールドとして定義する 2private Dictionary<string, WebBrowser> CheckBrowserPair = new Dictionary<string, WebBrowser>() 3{ 4 {nameof(checkBox21), browser1}, 5 {nameof(checkBox22), browser2}, 6 {nameof(checkBox23), browser3}, 7 {nameof(checkBox24), browser4}, 8}

上記のような辞書を登録しておくとCheckBrowserPair[checkBox.Name]で対応するブラウザコントロールのインスタンスを取得できます
ただ、こういうのはユーザーコントロールで内部に隠ぺいするのが感覚的に分かり易いかと思いますので、いったんこのやり方で出来ることを確認できて、かつやってることが何なのかを知らべてなんとなく理解できたのならユーザーコントロールを自作するというのを調べて実装すると良いかと思います


まだ、StartUpMethod();が何かわからないけれど・・・・
どのチェックボックスなのかはchkBox.Nameか何かで判定できます

チェックボックスがどれなのかを判定すればどのブラウザコントロールか判定できます
で、エスパー力が足りなくて見当外れだった回答ソースにある「処理クラスのインスタンスを取得するような名前」のメソッドでブラウザコントロールを受け取ります
で、チェックボックスとブラウザコントロールを引数に定義したメソッドを用意してやればcheckBox21.Text = "起動";といった感じでチェックボックスの決め打ちをしている部分を引数のチェックボックスのインスタンスを指定すれば良いだけかと思います
この質問の追加ソースのうち、チェックボックスのテキストプロパティの変更部分、イベントハンドラの名前から言って押したチェックボックス自身のテキストを変更してるだけですよね?押したのと違うチェックボックスはいじってませんよね?

であれば取得したチェックボックスとブラウザコントロールのインスタンスを以下のメソッドに渡せばStartUpMethodの中身以外は解決できそうです

c#

1//コントロールの型名、間違ってたら御免 2private void Browser起動停止切り替え(CheckBox checkBox, WebBrowse browser) 3{ 4 if (chkBox.Checked) 5 { 6// browser.Nameがあるかどうか確認してないけど、無いならDictionaryか何かで確保しておくと良いよ 7 DialogResult dialog = MessageBox.Show($"{browser.Name}を今すぐ停止しますか?", "ご確認ください", MessageBoxButtons.YesNo); 8 if (dialog == DialogResult.No) 9 { 10 checkBox.Checked = false;//もう一度イベントが飛んできそうだけど・・・ 11 return; 12 } 13 browser.Dispose(); 14 checkBox.Text = "起動"; 15 } 16 else 17 { 18 checkBox.Text = "停止"; 19 StartUpMethod(); 20 } 21} 22

以下はエスパー力が足りなかったためやや見当はずれな回答になっています

エスパー質問と判断して超能力を駆使して質問状況を判断して回答を書きます
エスパー能力が足りなかった場合は前提条件の把握に失敗してしまいますが僕自身では分からない為明後日の方向の回答となるかもしれませんが、それに関しての苦情がある場合は質問文へ情報を追加/修正して対応してください

僕の超能力を駆使した結果、
ボタンごとにそれぞれ異なる処理クラスを呼び出す画面のボタンのイベントハンドラを一つに統合したいという事の様です
であるならば解決法はインターフェースを定義します
サンプルソースだとTextproperty()がインターフェースで定義するものだと思われますが、property()はおそらく処理メソッドの事の様です
次に処理クラス全てにそのインターフェースを実装するクラスとして定義し、やりたい処理を同一名の処理メソッドにそれぞれ実装します
次に、提示されたソースでのSubMethodの中でsenderからボタンの名称を取得します

c#

1 var buttonName = (sender as button)?.Name ?? string.Empty;

そして名前から、戻り値の型が先に定義したインターフェースで呼び出したい処理クラスのインスタンスを取得するメソッドを定義したます

c#

1private インターフェース名 処理クラスのインスタンスを取得するような名前(string name) 2{ 3 switch(name) 4 case "ShoriA": 5 return shoria; // インスタンスが用意できている場合はこちら 6 retrun new ShoriA(); // インスタンスをその都度作る仕様ならこちら 7// 以下略 8}

また、処理クラスのインスタンスをMainMethodが受け取れるように引数を追加しておきます

c#

1//private void MainMethod() 2private void MainMethod(インターフェース名 obj)

そしてSubMethodの中で戻り値から処理メソッドを呼ぶようにします

c#

1 var shori = 処理クラスのインスタンスを取得するような名前(buttonName); 2 MainMethod(shori);

これでやりたいことが解決するはずです
解決しなかった場合は僕のエスパー力が足りていなかったという事でしょう
もしくはこのソースの意味を質問者さんが理解できなかった場合も同様です
分からないことはご自身で調べてみて、それでもわからなかったら質問してください
この状況でも調べずに何が何だかさっぱりわからんと言われてもこれ以上は僕のエスパー力では対応できません

投稿2021/06/06 02:35

編集2021/06/06 15:10
len_souko

総合スコア1363

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

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

neji-thon

2021/06/06 03:47

>len_soukoさん 具体的な案をありがとうございます。>< 何度も読み直してみます!
len_souko

2021/06/06 03:59

質問文の編集後の内容に合わせて情報を追記しました
len_souko

2021/06/06 04:09

ある程度理解が進んだらブラウザコントロールとチェックボックスをセットにしたユーザーコントロールを作ると幸せになれるかもしれません 起動時の処理が異なる場合は何とも言えませんが・・・
neji-thon

2021/06/06 05:25

>len_soukoさん ありがとうございます! checkBox.NameにてMainMethod側でチェックボックスの名前を確認できました! checkBox.TextにてMainMethod側でチェックボックスのテキストを指定できました! 次はブラウザ側のオブジェクトを探してます。
len_souko

2021/06/06 14:56

普通にデザイナの方でコントロールを選択してプロパティから名前を拾っておいて、Dictionaryか何かでチェックボックスと対になるブラウザコントロールをセットにするのが良いかと コードで名前を拾ってもどのチェックボックスと対になるのかって情報はデザイナを見ている開発者にしかわからないので・・・
neji-thon

2021/06/06 17:17 編集

>len_soukoさん 遅くにありがとうございます! 何度も寝落ちしながら繰り返しがんばってましたw 気づいたら、ディクショナリーの事も追加くださったのですね。ありがとうございます。がんばって読み込みます。 ちなみに対になるチェックボックスとブラウザはすでにわかっておりまして、重複したコードにずらずらと静的?に書き込んでいます。なので、、変更時に全部書き換えないといけないので共通化?をしたいと思ってた次第です。 で、ブラウザの方はWebview2を使用してたのですが、型は普通にWebview2でいけました。 WebView2 WebView2objでオブジェクトを引数で渡してあげて WebView2obj.Dispose()で実際に実行できました。 あとは懸念されておられました、StartUpMethodですが、確かに、そちらと、、さらによく考えたら動的にする必要がある箇所があり、、実はProperties.SettingsもcheckBox21_CheckedChangedやcheckBox22_CheckedChangedなどのメソッドの中に個別で指定していたので、そちらも動的にする必要があり苦戦していた所でした。 という事で、、以下2つも共通化して引数で渡す良い案はありますでしょうか? ・メソッド ・Properties.Settings 現状のコードになります。最初から赤裸々に書くべきでした。。すいません。 private void MainMethod(CheckBox checkBox, WebView2 WebView2obj, string BRName) { if (checkBox.Checked) { if (Properties.Settings.Default.Use_BRName == "ON") // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< { DialogResult dialog = MessageBox.Show("${BRName}を今すぐ停止しますか?", "ブラウザ停止確認", MessageBoxButtons.YesNo); if (dialog == DialogResult.No) { checkBox.Checked = false; return; } Properties.Settings.Default.Use_BRName = "OFF"; // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< Properties.Settings.Default.Save(); WebView2obj.Dispose(); // ←ここは動的に引数で渡せました! checkBox.Text = "起動"; } } else { if (Properties.Settings.Default.Use_BRName == "OFF") // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< { Properties.Settings.Default.Use_BRName = "ON"; // ←このプロパティ(Use_BRName)名を動的に引数で渡したいです>< Properties.Settings.Default.Save(); checkBox.Text = "停止"; StartUpMethod(); // ←このメソッドの名前を動的に引数で渡したいです>< } } } もし、かなり複雑になるようであれば、StartUpMethodに関しては呼び出し元のcheckBox21_CheckedChangedやcheckBox22_CheckedChanged側で直接、個別に書き込むくらいならいいかと思いますが、プロパティの方はなんとかしたいという感じです。。。 何度もご迷惑おかけしますが、よろしくお願いいたします。m(__)m
neji-thon

2021/06/06 16:22

補足です~ StartUpMethodもよくよく考えたら、それぞれのブラウザごとに個別でURLやらブラウザのオブジェクト名、イベントハンドラなどを指定するメソッドを用意してました。それらも今回をきっかけに共通化できないか頑張ってみます。
len_souko

2021/06/06 21:11

見づらいのと他の方が見ないかもしれないので、質問文の方へも追記出来ますか? また、Properties.Settings.Defaultですが、文字列を指定して値が取得できるのでそっちを適用すればWebView2obj.Nameから作る事が出来ますか? それとも全然関係名前になっていますか? https://dobon.net/vb/dotnet/programing/mysettings.html#section3 //設定Textの値を取得 Console.WriteLine(Properties.Settings.Default.Text); //または次のようにもできる Console.WriteLine(Properties.Settings.Default["Text"]);
neji-thon

2021/06/07 00:59

ありがとうございます。 質問へ追加しました。 Properties.Settings試してみます。
neji-thon

2021/06/18 23:45

>len_soukoさん ようやく残り2つもクリアできました! 稚拙な質問により、エスパーになってくださったlen_soukoさんをはじめ、皆様にはご迷惑をおかけしました。 おかげさまで、ようやく答えにたどり着いて目的のコードができ、SubMethod側は1行で済むコードが書けました。 自己解決。というのは恐縮ではありますが、一応まとめたのでクローズしようと思います―
len_souko

2021/06/20 12:11

無事解決したようで何よりです 今回の質問で様々な問題がありましたが、次回からは最初から活かせるようにしましょう 途中起きていたベストアンサーの件は僕からはあえてノーコメントとしました なお、この回答は根本的な解決ではありません あくまでも質問を最初に見た時から推測した内容を元に解決手段として思いついた内容です 後々出てきた情報を踏まえると、ブラウザとボタンがセットになっているとのことなので、その塊を一つのコントロールとして扱うようにユーザーコントロールを作成することで、ボタンのイベントそのものはユーザーコントロール内の閉じた世界で完結するとより良いものとなるかと思います とはいっても僕自身はFormsのユーザーコントロールを作ったことがありませんので詳細は言及できませんが、今僕が仕事でやっているWPFのユーザーコントロールよりは楽にできるようなので、今後のステップアップに勉強してみてはいかがでしょうか? 勿論、仕事の場合はスケジュールとの兼ね合いもありますので無理にユーザーコントロール化する必要はありません
neji-thon

2021/06/20 14:11

>len_soukoさん コメントありがとうございますー ユーザーコントロールもいつかチャレンジします!WPFはまだ早かったようですので、現状のツールが形となって落ち着いたらそれをWPFに移植がてら学習してこうと思います。 質問の仕方に関しては簡潔に短めに質問したつもりが具体的でなく抽象的であったためと、客観的に質問文をみなおすことが足りてなかったかもしれません。 次回から気を付けます。 引き続きよろしくお願いいたします。
guest

0

まとめます。

今回の質問は以下4点の要素を別のメソッドに渡す方法は?という質問でした。
・チェックボックス
・ブラウザオブジェクト(webview2)
・プロパティセッティング
・メソッド

前提として複数のブラウザがあり、それぞれのブラウザで停止・起動を実行するCheckedChangedイベントを用意してました。
CheckedChangedイベントが10個以上あって、ブラウザの名前などがそれぞれ異なるものの、同じ動作だったのでオリジナルのメソッド一つに渡して簡潔にできないかな?という目的がありました。

1つずつ簡潔に書くとこうです。
※変数の名前は自由だけど、型名はちゃんとしないといけない

・チェックボックス
(CheckBox)senderでメソッドへ渡し、(CheckedChangedの中から実行するからだと思います)
CheckBox checkBoxで引数を受け取ったら
checkBoxとして利用可能

・ブラウザオブジェクト(webview2)
WebView2objのオブジェクト名そのものでメソッドへ渡し
WebView2 WebView2objで引数を受け取ったら
WebView2objとして利用可能

・プロパティセッティング
"PropName"の最後のプロパティ部分のみ、文字列でメソッドへ渡し
string PropNameで引数を受け取ったら
Properties.Settings.Default[$"{PropName}"]として利用可能

・メソッド
() => StartUpMethod()でメソッドへ渡し
Action StartUpMethodで引数を受け取ったら
StartUpMethod()として実行可能

まとめ

C#

1private void MainMethod(CheckBox checkBox, WebView2 WebView2obj, string BRName, Action StartUpMethod, string PropName) 2 { 3 if (checkBox.Checked) 4 { 5 if (Properties.Settings.Default[$"{PropName}"].ToString() == "ON") 6 { 7 DialogResult dialog = MessageBox.Show($"{BRName}を今すぐ停止しますか?", "ブラウザ停止確認", MessageBoxButtons.YesNo); 8 if (dialog == DialogResult.No) { checkBox.Checked = false; return; } 9 Properties.Settings.Default[$"{PropName}"] = "OFF"; 10 WebView2obj.Dispose(); checkBox.Text = $"起動"; 11 } 12 } 13 else 14 { 15 if (Properties.Settings.Default[$"{PropName}"].ToString() == "OFF") 16 { 17 Properties.Settings.Default[$"{PropName}"] = "ON"; 18 checkBox.Text = "停止"; StartUpMethod(); 19 } 20 } 21 Properties.Settings.Default.Save(); 22 } 23 24 private void checkBox21_CheckedChanged(object sender, EventArgs e) 25 { 26 MainMethod((CheckBox)sender, WebView2obj, "BRName", () => StartUpMethod(), "PropName"); 27 } 28 private void checkBox22_CheckedChanged(object sender, EventArgs e) 29 { 30 MainMethod((CheckBox)sender, WebView2obj2, "BRName2", () => StartUpMethod2(), "PropName2"); 31 }

質問した当初は、型名の意識もできておらず上記4つとも、まったく同じような手法で渡せるのでは。と思ってました。私のようなとっちらかった質問にもなんとか、くみ上げようとしていただけた皆様に感謝です。ありがとうございました。

今後ともよろしくお願いします。

投稿2021/06/18 23:48

neji-thon

総合スコア7

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

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

退会済みユーザー

退会済みユーザー

2021/06/19 00:10

解決のために一番役に立った回答&コメントにベストアンサーを付けましょう。
neji-thon

2021/06/19 10:00

ご教示ありがとうございます!付け替えましたー
guest

0

クロージャー使って変数をキャプチャしたメソッドを作ってもいいけど
単純にDictionaryでいいのでは?

c#

1private class BrowserProperties{ 2 public object browser; 3 public string name; 4 public BrowserProperties(object _browser, string _name){ 5 browser = _browser; 6 name = _name; 7 } 8} 9 10Dictionary<CheckBox, BrowserProperties> dict; 11 12private void チェックボックスにデリゲート設定する奴(CheckBox box, object browser, string name){ 13 dict.Add(box, new BrowserProperties(browser, name)); 14 box.CheckedChanged += checkBoxs_CheckedChanged; 15} 16private void checkBoxs_CheckedChanged(object sender, EventArgs e) 17{ 18 CheckBox chkbox = (CheckBox)sender; 19 BrowserProperties prop = dict[chkbox]; 20 if (chkBox.Checked) 21 { 22 DialogResult dialog = MessageBox.Show($"{prop.name}を今すぐ停止しますか?", "ご確認ください", MessageBoxButtons.YesNo); 23 if (dialog == DialogResult.No) 24 { 25 chkbox.Checked = false; 26 return; 27 } 28 prop.browser.Dispose(); 29 chkbox.Text = "起動"; 30 } 31 else 32 { 33 chkbox.Text = "停止"; 34 StartupMethod(); 35 } 36}

投稿2021/06/06 04:21

asm

総合スコア15149

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

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

neji-thon

2021/06/18 23:45

>asmさん ご提案ありがとうございました。 返事ができてなくてすいません。パニックでしたw ご提案の内容もいつか理解できるように頑張ります!
guest

0

ふつーに引数でオブジェクトを渡せばいいです。
動かないのはやり方がまずいから。

投稿2021/06/05 21:46

y_waiwai

総合スコア88042

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

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

neji-thon

2021/06/06 03:48

>y_waiwaiさん コメントありがとうございます! はい。普通にオブジェクトを渡したいです。やり方を勉強中です。 質問の仕方に問題があり、申し訳ありませんでした。 質問分に追記してみましたのでよかったらご教示いただけますと幸いです。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問