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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2932閲覧

引数ありのメソッドの作成方法

maam

総合スコア55

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2019/01/16 08:08

編集2019/01/17 00:47

同じような処理を何度も書いているため、
新しくメソッドを作って呼び出そうと思っています。
呼び出し元では処理は同じなのですが、対象のラベル名、テキストボックス名が違うため
それらを引数として扱おうと思っています。

C#

1if (DateTime.Now.CompareTo(dateTime) >= 0) 2{ 3 label11.Text = ""; 4 comboBox1.BackColor = Color.White; 5 comboBox2.BackColor = Color.White; 6 comboBox3.BackColor = Color.White; 7} 8else 9 { 10 label11.Text = "生年月日が不正です。"; 11 comboBox1.BackColor = Color.MistyRose; 12 comboBox2.BackColor = Color.MistyRose; 13 comboBox3.BackColor = Color.MistyRose; 14 return; 15 } 16} 17//郵便番号の判定 18if((yuubin1 == "" && yuubin2 == "")|| (yuubin1 != "" && yuubin2 != "")) 19{ 20 label12.Text = ""; 21 textYuubin1.BackColor = Color.White; 22 textYuubin2.BackColor = Color.White; 23} 24else 25{ 26  label12.Text = "郵便番号が不正です。"; 27 textYuubin1.BackColor = Color.MistyRose; 28 textYuubin2.BackColor = Color.MistyRose; 29 return; 30 } 31

見てもらうとわかるように
label内を””にしたり、Backcolorを変更することは同じです。

メソッドは以下の2つ作りたいと思っています。
・labelを空白にする & BackColorを白にする
・labelにメッセージを表示する & BackColorを赤にする

アドバイスをいただけないでしょうか。
よろしくお願い致します。

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

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

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

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

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

len_souko

2019/01/16 16:15

ソースの下の文章内、"label"が"lavel"になってますよ
maam

2019/01/17 00:48

ご指摘ありがとうございます。訂正しました
guest

回答2

0

ベストアンサー

多分悩むのは、背景色のほうだと思います。基底クラスの型で受けとる関数にすれば、comboboxもtextも代入できます。当然個数が違うので配列みたいなデータ形式にする。

csharp

1private void Reset(TextBox text, IEnumerable<Control> Controls) 2//private void Reset(TextBox text, Control[] Controls) こんなんでもいいです。もし分かりにくければ 3{ 4 text.Text = string.Empty; 5 foreach(var ctrl in Controls) 6 { 7 ctrl.BackColor = Color.White 8 } 9} 10private void Raise(TextBox text, string message, IEnumerable<Control> Controls) 11{ 12 text.Text = message; 13 foreach(var ctrl in Controls) 14 { 15 ctrl.BackColor = Color.MistyRose; 16 } 17}

投稿2019/01/16 08:20

編集2019/01/16 09:03
papinianus

総合スコア12705

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

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

maam

2019/01/16 08:50

ご回答ありがとうございます。 IEnumerable<Control> Controlsというものを初めて見ました。 どういう役割があるのか詳しく教えていただけないでしょうか…
papinianus

2019/01/16 09:02

IEnumerable<Control>は型です(stringとかintとかboolとかint[]とかと同じ)。Controlsは変数名なので省略 オブジェクト指向のお話を思いだしてほしいのですが、例えば、comboboxも、textboxも共通の祖先であるControlを継承しています(動物→人間、動物→馬みたいに。人間も馬もどっちも動物)。これがここにControlと書いてある理由です。 IEnumerableのIは、インターフェイスをあらわしています。Interfaceはクラスの継承とは別で、特定の機能をもっている(実装している)ことを表現するものです(人間も、走れる、馬も走れる、動物でない車も走れる。動物でもペンギンは走れない。このとき、人間や車はIRunnableを実装していると言えます) IEnumerableは「かぞえあげることができる」という意味およびその実装をもっており、ここではforeachにかけることができる、という機能をもっているならList<T>でもT[]でも何でもいいよ、ということでこうしました。 IEnumerableに<>があるのはジェネリックインターフェイスであることを示しています。これは、配列みたいなIEnumerableに入っているものの型を指定する機能です。IEnumerable自身は配列っぽいものなので、それがintの配列(int[])なのか、stringの配列なのか(string[])を宣言時に決めると思います。 なので、そこで言っていることをざっくりまとめると、「配列っぽいものをください、中身がControlのやつで」ということになります。
maam

2019/01/17 00:55

とてもわかりやすいご説明をしてくださりありがとうございます。 型にもたくさんの種類があるのですね…
YAmaGNZ

2019/01/17 01:03

Control[] Controlsにするのであれば、params Control[] Controlsのほうが分かりやすそうな気がします。 呼び出すとき Reset(TextBox1,new Control[]{label1,label2}); ではなく Reset(TextBox1,label1,label2); となりますし
papinianus

2019/01/17 01:12

maam様へ(また疑問がわくのではないかと思い) paramsは可変長引数を使うためのキーワードであり、かつparamsは配列でしか使えない(配列なら使える)ため、このようなご提案をいただいています。 可変長にすると、呼び出すときの2つ目に書いてあるように、最後の変数を何個でも(0個でも)すきにかけるようになります。 配列であることを強制してしまうと、呼び出すとき、の1つ目のように事前に配列にして、渡さないといけない。 利用するうえでは便利ですよね。
maam

2019/01/17 01:18

YAmaGNZさん papinianusさん 細かいことまで教えていただきありがとうございます>< paramsも初めて目にするものです。配列でしか使うことができないんですね。 確かに毎回配列として呼び出すよりも、最初に宣言しておけば便利ですね。 初心者の自分にお時間をつかっていただき本当にありがとうございます。
maam

2019/01/17 02:43

もうひとつ質問があります。 呼び出し側ですが、 Reset(TextBox1,label1,label2);というのは TextBox1 → 色が変わる label1,label2 → メッセージを表示する 箇所で合っていますか?
papinianus

2019/01/17 02:45

逆っす。最初のやつが、メッセージをEmpty("")にするやつで、可変のやつは背景色をかえるやつです。
YAmaGNZ

2019/01/17 02:49

private void Reset(TextBox text, params Control[] Controls) と宣言して Reset(TextBox1,label1,label2); と呼び出した場合、 textにTextBox1が入り、Controlsにlabel1、label2が入ります。
maam

2019/01/17 03:51

private void Reset(TextBox text,Control[] Controls) { //labelを空白、BackColorを白にするメソッド定義 text.Text = string.Empty; foreach(var ctrl in Controls) { ctrl.BackColor = Color.White; } } private void Raise(TextBox text, string message,Control[] Controls) { //labelにメッセージ"必須入力項目です"、BackColorを赤にするメソッド定義 text.Text = "必須入力項目です。"; foreach(var ctrl in Controls) { ctrl.BackColor = Color.MistyRose; } } private void Error(TextBox text, string meesage,Control[] Controls) { //labelにメッセージ"生年月日が不正です"、BackColorを赤にするメソッド定義 text.Text = "生年月日が不正です。"; foreach (var ctrl in Controls) { ctrl.BackColor = Color.MistyRose; } } private void AddBt_Click(object sender, EventArgs e) { //必須項目の判定 if (sei == "" || mei == "") { //姓が空欄の時 if (sei == "") { //label9.Text = "必須入力項目です。"; //textSei.BackColor = Color.MistyRose; Raise(label9, new Control[]{textSei}); } else { //label9.Text = ""; //textSei.BackColor = Color.White; Reset(label9, new Control[]{ textSei }); } 現在、このように作成しているのですが、Raiseの部分に ”(TextBox,string,control[])の必要な仮パラメーター’Controls’Controlsに対応する特定の引数がありません。” label9に”’’System.Windows.Forms.Label’から’System.Windows。Forms.TextBox’へ変換することはできません。” というエラーがでてしまいました…。
YAmaGNZ

2019/01/17 03:56

Reset、Raiseともに第1引数はTextBoxと定義しています。 ですので、LabelからTextBoxへ変換しようとしてできませんとエラーになります。 第一引数がLabelでいいのでしたら、Labelで宣言してください。
maam

2019/01/17 04:00

label9の”’’System.Windows.Forms.Label’から’System.Windows。Forms.TextBox’へ変換することはできません。” というエラーは消えました! もう一つのエラーの原因はなんでしょうか…。
maam

2019/01/17 04:09

messageの使い方が違っていたみたいです。 下記でうまく動きました! ありがとうございます>< //姓が空欄の時 if (sei == "") { Raise(label9, "必須入力項目です", new Control[]{textSei}); } else { Reset(label9, new Control[]{ textSei }); }
papinianus

2019/01/17 04:35

labelだったのですね。それは失礼しました。型の指定をControlにしてもいいのかもしれないです。
maam

2019/01/17 04:39

説明不足ですみませんでした…。型の指定とはどの部分のことですか?
papinianus

2019/01/17 04:45 編集

private void Raise(TextBox text, string message, IEnumerable<Control> Controls) この関数の引数の、^^^^^ ここです。これを > private void Raise(Control MessageTarget, string message, Control[] Controls) こういう感じ
maam

2019/01/17 04:54

そういうことですね! 先程のYAmaGNZさんのアドバイスを受けて、 private void Raise(Label MessageTarget, string message, Control[] Controls)          ^^^ にしましたが、いかがでしょうか。
YAmaGNZ

2019/01/17 05:00

設計しだいじゃないですか? 第一引数がLabelでいいのか、汎用的にControlのほうがいいのかなんて第三者には分からないでしょ。
papinianus

2019/01/17 05:11

YAmaGNZ様のおっしゃるとおりです。質問から配列のほうはControlじゃないとそもそも実現できないのでそうしました。あとはこのパーツをどの程度の範囲で利用するのかです。 個人的には(他の言語の経験から)型は具体的に絞っておくほうが(つまり、Controlじゃなく、LabelやTextBoxのほうが)好きですが、この関数この用途ならControlをすすめます。
maam

2019/01/17 05:11

そうですね。 今回は全てLabelで特定されているのでLabelにします。 ありがとうございました!
guest

0

ラベル名、テキストボックス名を渡すより、背景色と文字列を返す方が汎用性があるんじゃないかと思います。

C#

1 2private void button1_Click(object sender, System.EventArgs e) 3{ 4 5 // 呼び出し側 6 string[] strs = { yuubin1, yuubin2 }; 7 string msg; 8 foreach (var s in strs) 9 { 10 msg = Result(s, out Color backColor); 11 label12.Text = msg; 12 textYuubin1.BackColor = backColor; 13 textYuubin2.BackColor = backColor; 14 } 15 16 // DatetimeはTryParseで変換できるか判定できる 17 DateTime dt; 18 if (DateTime.TryParse(dateTime, out dt)) // 変数dateTimeはstring型 19 { 20 // できる 21 } 22 else 23 { 24 // できない 25 } 26 27} 28 29// メソッド 30private string Result(string str, out Color backColor) 31{ 32 string msg; 33 34 if (String.Empty(str)) 35 { 36 backColor = Color.MistyRose; 37 msg = "不正な値です。"; // msg = Properties.Resources.(Message); でリソース管理でもいいと思います。 38 } 39 else 40 { 41 backColor = Color.White; 42 msg = string.Empty; 43 } 44 45 return msg; 46} 47 48 49 50

ついでにですが、

if((yuubin1 == "" && yuubin2 == "")|| (yuubin1 != "" && yuubin2 != ""))

if (yuubin1 != "" && yuubin2 != "")
でやりたいことができると思います。
生年月日以外に日付を判定するものがあるなら、空白検知のメソッドと同じようにメソッドを作ってもいいと思います。
一つ一つ多分コントロールの横にラベルを置いているんだと思うのですが、
冗長になってしまうので、シンプルに不正な値です、だけでも分かるんじゃないかなと思うのが個人的な意見です。

投稿2019/01/16 10:17

pontaq

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問