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

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

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

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

Q&A

2回答

3078閲覧

複数のコンボボックスの値をまとめてテキストボックスに表示したいです。

Krea

総合スコア0

C#

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

0グッド

0クリップ

投稿2020/09/26 07:38

前提・実現したいこと

Visual STudioで コンボボックス、テキストボックス、ボタン、ラベルをつかい 
年、月、日、曜日をテキストボックスに表示するシステムを作っています。

見づらいので以下のように省略します。
テキストボックス = txt コンボボックス = cmb ラベル = lbl ボタン = btn

↓レイアウト↓

[lbl:年] [cmb] [lbl:月] [cmb] [lbl:日] [cmb]

[lbl:yyyy/MM/dd 表示] [txt]

[lbl:yyyy年MM月dd日 表示] [txt]

[lbl曜日] [txt]

[btn:表示] [btn:クリア] [btn:閉じる]

↓下から質問になります↓
[ボタン 表示]を押して [ラベル yyyy/MM/dd 表示] と [ラベル yyyy年MM月dd日 表示] の横のテキストボックスに表示しようと思い、ボタンを押したところでエラー?のような文字がテキストボックスに表示されました。

プログラミングを初めて一か月で、初投稿で見づらい、詳細が足りなかもしれません。すいません。
補足に設計書を書いてみました。

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

[ラベル yyyy/MM/dd 表示]のテキストボックス↓ System.Windows.Forms.ComboBox+ObjectCollection/System.Windows.Forms.ComboBox+ObjectCollection/System.Windows.Forms.ComboBox+ObjectCollection [ラベル yyyy年MM月dd日 表示]のテキストボックス↓ System.Windows.Forms.ComboBox, Items.Count: 3年System.Windows.Forms.ComboBox, Items.Count: 12月System.Windows.Forms.ComboBox, Items.Count: 30日

該当のソースコード

C#

1private void btnD_Click(object sender, EventArgs e) 2{ 3txtymdO.Text = (cmbY.Items.ToString() + "/" + cmbM.Items.ToString() + "/" + cmbD.Items.ToString()); 4txtymdU.Text = (cmbY.ToString()+ "年" + cmbM.ToString() + "月" + cmbD.ToString() + "日"); 5} 6 7.Itemsが上のコードにはあって下のコードにはないのは、いろいろ試していたためです。↑ 8該当のソースコードは張りましたが、これだけではわからないと思うので下にすべて張っておきます。 9 10 11using System; 12using System.Collections.Generic; 13using System.ComponentModel; 14using System.Data; 15using System.Drawing; 16using System.Linq; 17using System.Text; 18using System.Threading.Tasks; 19using System.Windows.Forms; 20 21namespace FinalTest 22{ 23 public partial class FrmTest2 : Form 24 { 25 public FrmTest2() 26 { 27 InitializeComponent(); 28 29 //「年」の選択肢が変わった時に呼び出されるイベントに、「月」の選択肢が変わった時のイベントを追加 30 cmbY.SelectedIndexChanged += new EventHandler(cmbM_SelectedIndexChanged); 31 32 //12回ループさせて、「Add」メソッドで引数の値をコンボボックスに追加 33 for (int i = 1; i < 13; i++) 34 { 35 cmbM.Items.Add(i); 36 } 37 cmbM.SelectedIndex = 0; 38 39 40 // 必要な変数を宣言する 41 DateTime dtNow = DateTime.Now; 42 43 //年の追加 44 cmbY.Items.Add(dtNow.Year - 1); 45 cmbY.Items.Add(dtNow.Year); 46 cmbY.Items.Add(dtNow.Year + 1); 47 48 49 // 初期値 50 cmbY.Text = dtNow.Year.ToString(); 51 cmbM.Text = dtNow.Month.ToString(); 52 cmbD.Text = dtNow.Day.ToString(); 53 54 } 55 56 private void btnClose_Click(object sender, EventArgs e) 57 { 58 this.Close(); 59 } 60 61 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 62 { 63 //cmbY 64 65 //日コンボをクリアする 66 cmbD.Items.Clear(); 67 //月 変更時 日の初期値を1にする 68 cmbD.Text = 1.ToString(); 69 } 70 71 private void cmbD_SelectedIndexChanged(object sender, EventArgs e) 72 { 73 74 } 75 76 private void cmbM_SelectedIndexChanged(object sender, EventArgs e) 77 { 78 //日コンボをクリアする 79 cmbD.Items.Clear(); 80 //月 変更時 日の初期値を1にする 81 cmbD.Text = 1.ToString(); 82 83 84 85 DateTime dtNow = DateTime.Now; 86 //現在の日の選択位置を記憶しておく 87 int DayIndex = cmbD.SelectedIndex; 88 89 //日コンボをクリアする 90 cmbD.Items.Clear(); 91 92 //存在する日数分、コンボボックスに日付けを設定する 93 int Days = DateTime.DaysInMonth(cmbY.SelectedIndex + dtNow.Year - 1 , cmbM.SelectedIndex + 1); 94 for (int i = 1; i < Days + 1; i++) 95 { 96 cmbD.Items.Add(i); 97 } 98 99 //日コンボの選択肢を設定 100 if (DayIndex < Days) 101 { 102 //選択されていた日付が、存在する日数を超えていなければそのまま選択 103 cmbD.SelectedIndex = DayIndex; 104 } 105 else 106 { 107 //超えていたら、最大値を選択 108 cmbD.SelectedIndex = Days - 1; 109 } 110 111 } 112 113 private void txtymdO_TextChanged(object sender, EventArgs e) 114 { 115 116 } 117 private void btnD_Click(object sender, EventArgs e) 118 { 119 120 121 txtymdO.Text = (cmbY.Items.ToString() + "/" + cmbM.Items.ToString() + "/" + cmbD.Items.ToString()); 122 txtymdU.Text = (cmbY.ToString()+ "年" + cmbM.ToString() + "月" + cmbD.ToString() + "日"); 123 124 125 /* // 必要な変数を宣言する 126 DateTime dtNow = DateTime.Now; 127 128 // 曜日を取得する 129 DayOfWeek uWeekday = dtNow.DayOfWeek; 130 131 //違う 132 txtWeek.Text = dtNow.DayOfWeek.ToString(); 133 */ 134 135 } 136 137 private void btnClear_Click(object sender, EventArgs e) 138 { 139 DateTime dtNow = DateTime.Now; 140 141 txtymdO.ResetText(); 142 txtymdU.ResetText(); 143 txtWeek.ResetText(); 144 cmbY.Text = dtNow.Year.ToString(); 145 cmbM.Text = dtNow.Month.ToString(); 146 cmbD.Text = dtNow.Day.ToString(); 147 148 149 150 } 151 152 private void txtWeek_TextChanged(object sender, EventArgs e) 153 { 154 155 } 156 } 157} 158 159

試したこと

・btnDのところにtry catchをいれメッセージボックスに表示しようとしましたが例外処理ではないためか
メッセージボックスは出ませんでした。

・txtymdU.Text = "a"; と打ち込んだところ表示されましたので問題は
右の(cmbY.Items.ToString() + "/" + cmbM.Items.ToString() + "/" + cmbD.Items.ToString());というところはわかりました。

・txtymdO.Text = "(cmbY.Items + "/" + cmbM.Items + "/" + cmbD.Items); も"/"があるので使えませんでした。

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

C# Visual Studio2019を使用しています。

↓設計書は以下の通りです↓
1コンボボックス「年」の選択リストには、昨年、今年、来年の西暦を設定する。
2.コンボボックス「月」の選択リストには、1~12を設定する。
3.コンボボックス「年」の初期値は、今日の年とする。
4.コンボボックス「月」の初期値は、今日の月とする。
5.コンボボックス「日」の初期値は、今日の日とする。

・コンボボックス変更時 
・コンボボックス「年」選択変更時
1.コンボボックス「日」の選択には、「年」、「月」に合わせて日にちを設定する。
閏年を考慮しましょう。
2.コンボボックス「日」の初期値は、「1」とする。

・コンボボックス「月」選択変更時
1.コンボボックス「日」の選択には、「年」、「月」に合わせて日にちを設定する。
閏年を考慮しましょう。
2.コンボボックス「日」の初期値は、「1」とする。

・「表示」ボタン押下
1.入力チェックをする。(入力チェック仕様に記載した内容)
2.コンボボックスの値から、 「yyyy/MM/dd 表示」TextBoxに値を表示する。
3.コンボボックスの値から、 「yyyy年MM月dd日 表示」TextBoxに値を表示する。
4.コンボボックスの値から、 「曜日」TextBoxに値を表示する。

・「クリア」ボタン押下
1最初に画面を開いた状態に戻る。

・「閉じる」ボタン押下
1当画面を閉じる

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

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

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

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

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

guest

回答2

0

ComboBoxで選択されているものの値を取得する方法を理解されていないようです。
ComboBox.SelectedItemプロパティなりこちらなりを参照してください。

投稿2020/09/26 07:54

YAmaGNZ

総合スコア10258

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

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

Krea

2020/09/26 07:56

そうですね。他の回答者様の回答を拝見しまして私自身でも感じました。 わざわざリンクを貼っていただきありがとうございます。 これから精進していきたいと思います!
Krea

2020/09/26 08:00

これはこの質問と関係ないことになってしまうのですが、コンボボックスの中身によって曜日を変えて表示することは可能でしょうか?
YAmaGNZ

2020/09/26 08:03

曜日を表示したいということであれば、作成した文字列(yyyy/MM/dd)をDateTime型に変換する方法も調べてください。 「DateTime.Parseメソッド」について調査されるとよろしいかと思います。 DateTime型に変換できれば、その日の曜日を求めることができます。
Krea

2020/09/26 08:07

はい!しらべてみます! 関係ない質問ですけどわざわざ返信していただいてありがとうございます! // 必要な変数を宣言する DateTime dtNow = DateTime.Now; // 曜日を取得する DayOfWeek uWeekday = dtNow.DayOfWeek; //違う txtWeek.Text = dtNow.DayOfWeek.ToString(); txtWeek.Text = dt(cmbY.Text, cmbM.Text,cmbD.Text).DayOfWeek.ToString(); このように出そうと思ったのですが dt(cmbY.Text, cmbM.Text,cmbD.Text).DayOfWeek.ToString(); ここの部分がやはり違いました。 変換する方法を調べてみます!!
YAmaGNZ

2020/09/26 08:13

その日の曜日をただ文字列で出力したいというのであれば、「C# DateTime 文字 曜日」で検索してみればよろしいかと思います。
dodox86

2020/09/26 08:18

(YAmaGNZさんがフォローしてくださっていました。失礼しました)
Krea

2020/09/26 08:51

YAmaGNZ様 dodox86様ありがとうございます! DateTime dt = DateTime.Now; ①txtWeek.Text = dt.ToString("dddd"); ②txtWeek.Text = (dt.DayOfWeek).ToString(); 上の方法①、②どちらの方法で曜日を表示することはできました。 ですが(恐らく今日の日付)土曜日しか出すことができませんでした。 私が考えるにDateTime dt = DateTime.Now;のNowの部分で今の日付を識別していると思います。 DateTime dt = DateTime.txtymdO(コンボボックスで日付を選択しテキストボックスですべてを合わせた年月日です);で出すのが正しいと思いました。 ですがエラーが出てしまいました。 このようにすることは可能でしょうか? 貼っていただいたリンクはすべて読ませていただきました!
YAmaGNZ

2020/09/26 08:58

順番に作っていきましょう。 1.コンボボックスで選択されたものから「yyyy/MM/dd」の形の文字列を作成する 2.1で作成した文字列をDateTime型に変換する 3.2で変換したDateTime型の曜日を出力する です。 上記の手順で使用するものは全て提示しています。
Krea

2020/09/26 09:55

手順をわかりやすく提示してくださったのに 恥ずかしながら回答をいただいてから取り掛かったのですが手順1で躓いてしまっています。 私の理解力と知識の足りなさが原因です。引き続き調べてみます。 せっかくわかりやすくかみ砕いてくださったのに申し訳ありません。
Krea

2020/09/26 09:56

ネットで調べ理解ができましたらまた質問させていただきます...
YAmaGNZ

2020/09/26 10:02

1に関してはy_waiwaiさんの回答のコメントでも出来たとおっしゃっていましたがどうなのでしょうか?
Krea

2020/09/26 10:10

txtymdO.Text = (cmbY.Text.ToString() + "/" + cmbM.Text.ToString() + "/" + cmbD.Text.ToString()); txtymdU.Text = (cmbY.Text.ToString()+ "年" + cmbM.Text.ToString() + "月" + cmbD.Text.ToString() + "日"); このようなコードになりまして コンボボックスの値から、 「yyyy/MM/dd 表示」TextBoxに値を表示する。 コンボボックスの値から、 「yyyy年MM月dd日 表示」TextBoxに値を表示する。 この二つの条件はクリアできました。 ですが 1.コンボボックスで選択されたものから「yyyy/MM/dd」の形の文字列を作成する 2.1で作成した文字列をDateTime型に変換する というYAmaGnZ様の手順はできませんでした。
YAmaGNZ

2020/09/26 10:23

プロパティに設定する型を意識するようにしたほうがいいかもしれません。 例えば、TextBoxのTextプロパティにはString型のものをセットします。 文字列もString型の変数に格納します。 ということは String ymd = (cmbY.Text + "/" + cmbM.Text + "/" + cmbD.Text); とすればいいわけです。 このような基礎的な部分は重要ですのでがんばって理解してください。
guest

0

コンボボックスの文字列は、
combobox1.Text
で取り出せます

投稿2020/09/26 07:45

y_waiwai

総合スコア87774

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

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

Krea

2020/09/26 07:51

できました!未経験でSEをはじめたのでこんな初歩もわからないなんて恥ずかしいですね。 本当に感謝です!ありがとうございます! これはこの質問と関係ないことになってしまうのですが、コンボボックスの中身によって曜日を変えて表示することは可能でしょうか?
y_waiwai

2020/09/26 08:00

年、月、日の数値から、DateTimeオブジェクトを生成すれば、曜日が出てきてくれます というか、こういう用途なら、DateTimeオブジェクトをベースとしてコードを書いていくべきですね https://www.sejuku.net/blog/52396
Krea

2020/09/26 08:05

// 必要な変数を宣言する DateTime dtNow = DateTime.Now; // 曜日を取得する DayOfWeek uWeekday = dtNow.DayOfWeek; //違う txtWeek.Text = dtNow.DayOfWeek.ToString(); txtWeek.Text = dt(cmbY.Text, cmbM.Text,cmbD.Text).DayOfWeek.ToString(); このように出そうと思ったのですが dt(cmbY.Text, cmbM.Text,cmbD.Text).DayOfWeek.ToString(); ここの部分がやはり違って悩んでいました。 貼っていただいたリンクを拝見させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問