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

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

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

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

Visual Studio

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

Q&A

解決済

2回答

24523閲覧

Visual studio 2015 自作カレンダー

niko2

総合スコア15

C#

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

Visual Studio

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

0グッド

1クリップ

投稿2016/11/18 09:38

###前提・実現したいこと

Visual Studio 2015 でC#をシステムを開発しています。

現在、日々のトレーニングなどを記録するシステムのカレンダー部分を作っています。

カレンダーを自作で作っているのですが、
仕様として、画像のように
プルダウンで年、月を選ぶとその年月のカレンダーがラベルで表示されるようにしようしています。(左上のカレンダーは題名、右上は更新日時、最終更新者となっています。)

日付をラベルで作る意図としては、そのラベルをクリックするとその日の予定一覧画面に飛べるようにするためです。

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

しかし、プルダウンで年月を選ぶとその年月のカレンダーを表示させる方法がわかりません。
実現する方法を教えていただけないでしょうか?

###該当のソースコード

Visual

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApplication1 12{ 13 public partial class Calendar : Form 14 { 15 public Calendar() 16 { 17 InitializeComponent(); 18 } 19 20 21 22 private void button1_Click(object sender, EventArgs e)/戻るボタンの処理(今回の質問に関係なし) 23 { 24 Windows1.Menu menu = new Windows1.Menu(); 25 menu.Show(); 26 Close(); 27 } 28 29 private void label13_Click(object sender, EventArgs e)/日付ラベルをクリックするとその日の予定画面を開く 30 { 31 CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails(); 32 calendardetails.Show(); 33 Close(); 34 } 35 } 36}

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

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

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

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

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

guest

回答2

0

ベストアンサー

そういうことですか、私もちょっと探してみましたが大きくする方法は
ほかの誰かが作ったコントロール使う以外にはあまりなさそうな感じでしたね。

自作するとなると以下のようなことを事が少し問題になってくるかと思われます。

  1. コンボボックス(年の方)はどれくらいの範囲で入れるか(現在±100年等)
  2. ラベルをすでに置いてて、日付だけ変えてるのであれば、1日が日曜だった場合5行じゃ足りない

適当に作ってそれっぽく動いたのが以下のコードになります。

C#

1private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { 2 //月が選択された 3 month = (int)comboBox1.SelectedItem; 4 setDate(); 5} 6 7private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { 8 //年が選択された 9 year = (int)comboBox2.SelectedItem; 10 setDate(); 11} 12private void setDate() { 13 var dFirst = new DateTime(year, month, 1);//選択された年月の1日 14 var dLast = dFirst.AddMonths(1).AddDays(-1);//選択された年月の最終日 15 var bdLast = dFirst.AddDays(-1);//先月の最終日 16 //numは1日をどのラベルからはじめるか決める変数 17 //日付に使用するラベル名はlabel8~label44 18 int num = 0;//月曜の場合8でそれ以降順に1づつ増える 19 if(dFirst.DayOfWeek == DayOfWeek.Monday) { 20 num = 8;//月曜はlabel8 21 } else if(dFirst.DayOfWeek == DayOfWeek.Tuesday) { 22 num = 9;//火曜はlabel9 23 } else if(dFirst.DayOfWeek == DayOfWeek.Wednesday) { 24 num = 10;//水曜はlabel10 25 } else if(dFirst.DayOfWeek == DayOfWeek.Thursday) { 26 num = 11;//木曜はlabel11 27 } else if(dFirst.DayOfWeek == DayOfWeek.Friday) { 28 num = 12;//金曜はlabel12 29 } else if(dFirst.DayOfWeek == DayOfWeek.Saturday) { 30 num = 13;//土曜はlabel13 31 } else if(dFirst.DayOfWeek == DayOfWeek.Sunday) { 32 num = 14;//日曜はlabel4 33 } 34 //label8~label49(6行分)全部設定 35 for(int i = 8; i <= 49; i++) { 36 var d = i - num;//1日より何日前か(後か) 37 this.Controls["label" + i].Text = (dFirst.AddDays(d).Day).ToString(); 38 if(i < num || d >= dLast.Day) { 39 //選択月の前の月の最後の方と次の月の最初はグレー 40 this.Controls["label" + i].ForeColor = Color.Gray; 41 } else { 42 //選択月は黒 43 this.Controls["label" + i].ForeColor = Color.Black; 44 } 45 } 46}

投稿2016/11/18 21:53

Hey_CH

総合スコア437

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

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

niko2

2016/11/19 13:39

私自身がプログラミングが初心者に毛が生えたレベルのため、知識と理解力が乏しく、 頂いたソースを実行してみたところうまくいきませんでした。 テストように新たにフォームを作成し、comboBox1、comboBox2、label1~43を作成し、頂いたソースを実行してみました。 しかし、そのままlabel1~43が表示されるだけでcomboBoxに数値を入力してみても反応ありませんでした。labelのテキストも変わっていない状況です。 疑問点があるのですが ・頂いたソースを実行するにあたり、month,yearをフォームにint型で定義しましたがあってますでしょうか。 ・private void setDate() を自分でソースを入力しましたが、labelなどのように、どこかをクリックして自動的にprivate void setDate() {}をつくらないといけないのでしょうか。 初心者すぎる質問かもしれませんが、何卒回答していただけると幸いです。
Hey_CH

2016/11/19 13:58

疑問点について: ・int型でのmonthとyearの定義はその通りです。 ・private void setData()関数はForm1.csに手で書き込みました。 以下のコードでcomboBox1、comboBox2、label1~43を作成+以下のコードをコピペで動くと思います。 ```C# public partial class Form1 : Form { int year = DateTime.Now.Year; int month = DateTime.Now.Month; public Form1() { InitializeComponent(); for(int i = 1; i <= 12; i++) comboBox1.Items.Add(i); for(int i = year - 100; i <= year + 100; i++) comboBox2.Items.Add(i); comboBox1.SelectedItem = month; comboBox2.SelectedItem = year; comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; comboBox2.SelectedIndexChanged += comboBox2_SelectedIndexChanged; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { //年が選択された month = (int)comboBox1.SelectedItem; setDate(); } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { //月が選択された year = (int)comboBox2.SelectedItem; setDate(); } private void setDate() { var dFirst = new DateTime(year, month, 1);//選択された年月の1日 var dLast = dFirst.AddMonths(1).AddDays(-1);//選択された年月の最終日 var bdLast = dFirst.AddDays(-1);//先月の最終日 //numは1日をどのラベルからはじめるか決める変数 //日付に使用するラベル名はlabel8~label44 int num = 0;//月曜の場合1でそれ以降順に1づつ増える if(dFirst.DayOfWeek == DayOfWeek.Monday) { num = 8;//月曜はlabel8 } else if(dFirst.DayOfWeek == DayOfWeek.Tuesday) { num = 9;//火曜はlabel9 } else if(dFirst.DayOfWeek == DayOfWeek.Wednesday) { num = 10;//水曜はlabel10 } else if(dFirst.DayOfWeek == DayOfWeek.Thursday) { num = 11;//木曜はlabel11 } else if(dFirst.DayOfWeek == DayOfWeek.Friday) { num = 12;//金曜はlabel12 } else if(dFirst.DayOfWeek == DayOfWeek.Saturday) { num = 13;//土曜はlabel13 } else if(dFirst.DayOfWeek == DayOfWeek.Sunday) { num = 14;//日曜はlabel8 } //label8~label49全部設定 for(int i = 8; i <= 49; i++) { var d = i - num;//1日より何日前か(後か) this.Controls["label" + i].Text = (dFirst.AddDays(d).Day).ToString(); if(i < num || d >= dLast.Day) { //選択月の前の月の最後の方 this.Controls["label" + i].ForeColor = Color.Gray; } else { //選択月 this.Controls["label" + i].ForeColor = Color.Black; } } } } ```
Hey_CH

2016/11/19 14:01

すいません、訂正で、label1~49を作成です。(label1~7は月~日の曜日用です)
niko2

2016/11/21 06:31

丁寧な回答、ありがとうございます。 無事実行できました。 ベストアンサーに選ばせていただきました。 ありがとうございます。
guest

0

質問で返してすいませんが、MonthCalendarコントロールを使用しない理由が何かありますか?
年/月の選択や曜日の設定等は全く考える事無く必要な処理を実装できそうな気がしますが。

C#

1//monthCalendar1.MaxSelectionCount=1; 2 3private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) { 4 DateTime selected = monthCalendar1.SelectionStart;//選択した日付 5 //日付を選択したときにする処理 6}

投稿2016/11/18 11:21

Hey_CH

総合スコア437

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

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

niko2

2016/11/18 12:53

HeyHeyHoさん 回答ありがとうございます。 MonthCalendarコントロールを使わない理由としては、画面のサイズに大きさを変更出来ないからです。 http://blog.hiros-dot.net/?page_id=3495 などを参考にしてみましたが、このページではWindowsFormを使用した場合については述べられていなかったため、大きさを変更する方法が見つかりませんでした。 そのため、自作でカレンダーを作る以外方法がないのではないかと考え、今に至ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問