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

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

ただいまの
回答率

87.61%

Month Calendarについて

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,234

score 1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MyHouseKeepingBook
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       private void buttonAdd_Click(object sender, EventArgs e)
       {
           AddData();
       }
       private void 追加AToolStripMenuItem_Click(object sender, EventArgs e)
       {
           AddData();
       }
       private void AddData()
       {
           ItemForm frmItem = new ItemForm(CategoryDataSet1);
           DialogResult drRet = frmItem.ShowDialog();
           if (drRet == DialogResult.OK)
           {
               moneyDataSet.moneyDataTable.AddmoneyDataTableRow(
               frmItem.monCalendar.SelectionRange.Start,
               frmItem.cmbCategory.Text,
               frmItem.txtItem.Text,
               int.Parse(frmItem.mtxtMoney.Text),
               frmItem.txtRemarks.Text);
           }
       }
       private void Form1_Load(object sender, EventArgs e)
       {
           LoadData();
           categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("給料", "入金");
           categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("食費", "出金");
           categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("雑費", "出金");
           categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("住居", "出金");
       }
       private void buttonEnd_Click(object sender, EventArgs e)
       {
           this.Close();
       }
       private void 終了XToolStripMenuItem_Click(object sender, EventArgs e)
       {
           this.Close();
       }
       private void SaveData()
       {
           string path = "MoneyData.csv"; //出力ファイル名
           string strData = ""; //一行分のデータ
           System.IO.StreamWriter sw = new System.IO.StreamWriter(
                  path,
                  false,
                  System.Text.Encoding.Default);
           foreach (MoneyDataSet.moneyDataTableRow drMoney
           in moneyDataSet.moneyDataTable)
           {
               strData = drMoney.日付.ToShortDataString() + ","
                       + drMoney.分類 + ","
                       + drMoney.品目 + ","
                       + drMoney.金額.ToString() + ","
                       + drMoney.備考;
               sw.WriteLine(strData);
           }
           sw.Close();
       }
       private void 保存SToolStripMenuItem_Click(object sender, EditorArgs e)
       {
           SaveData();
       }
       private void form1_FormClosing(object sender, FormClosingEditorArgs e)
       {
           SaveData();
       }
       private void LoadData()
       {
           string path = "MoneyData.csv"; //入力ファイル名
           string delimStr = ","; // 区切り文字
           char[] delimiter = delimStr.ToCharArray(); // 区切り文字をまとめる
           string[] strLine; // 分解後の文字の入れ物
           string strLine; // 一行分のデータ
           bool fileExists = System.IO.File.Exists(path);
           if (fileExists)
           {
               System.IO.StreamReader sr = new System.IO.StreamReader(
                path,
                System.Text.Encoding.Default);
               while (sr.Peek() >= 0)
               {
                   strLine = sr.ReadLine();
                   strData = strLine.Splite(delimiter);
                   moneyDataSet.moneyDataTable.AddmoneyDataTableRow(
                            DateTime.Parse(strData[0]),
                            strData[1],
                            strData[2],
                            int, Parse(strData[3]),
                            strData[4];
               }
               sr.Close;
           }
       }
       private void UpdateData()
       {
           int nowRow = dgv.CurrentRow, Index;
           DateTime oldDate
           = DateTime.Parse(dgv.Rows[nowRow].Cell[0].Value.ToString());
           string oldCategory = dgv.Rows[nowRow].Cell[1].Value.ToString();
           string oldItem = dgv.Rows[nowRow].Cell[2].Value.ToString();
           int oldMoney
           = int.Parse(dgv.Rows[nowRow].Cells[3].Value.ToString());
           string oldRemarks = dgv.Rows[nowRow].Cells[4].Value.ToString();
           ItemForm frmItem = newItemForm(categoryDataSet1,
           oldDate,
           oldCategory,
           oldItem,
           oldMoney,
           oldRemarks);
           DialogResult draRet = frmItem.ShowDialog();
           if (draRet == DialogResult.OK)
           {
               dgv.Rows[nowRow].Cells[0].Value
               = frmItem.monCalendar.SelectionRangr.Start;
               dgv.Rows[nowRow].Cells[1].Value = frmItem.cmbCategory.Text;
               dgv.Rows[nowRow].Cells[2].Value = frmItem.txtItem.Text;
               dgv.Rows[nowRow].Cells[3].Value = int.Parse.(frmItem.mtxtMoney.Text);
               dgv.Rows[nowRow].Cells[4].Value = frmItem.txtRemarks.Text;
           }
       }
       private void buttonChange_Click(object sender, EditorArgs e)
       {
           UpdateData();
       }
       private void 変更CToolStripMenuItem_Click(object sender, EditorArgs e)
       {
           UpdateData();
       }
       private void DeleteData()
       {
           int nowRow = DataGridView.CurrentRow.Index;
           DataGridView.Rows.RemoveAt(nowRow); // 現在行を削除
       }
       private void buttonDelete_Click(object sender, EditorArgs e)
       {
           DeleteData();
       }
       private void buttonChange_Click(object sender, EditorArgs e)
       {
           DeleteData();
       }
   }
}

家計簿アプリの作成をVisual StudioのC#で行なっております。
Month Calendar でCSVに既に登録されている日付を選択できなくし、既に登録されている日付を選択するとメッセージボックスが表示されるようにしたいです。
説明が不自由かも知れませんが、ご教示いただければと存じます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2020/07/30 21:53 編集

    起動時に CsvHelper で CSV を読み込んでオブジェクトのリストにし、そこから日付を取り出して HashSet を作ります。Monthly Caledar の選択イベントをハンドルして HashSet から選択された日付を探し、存在すればメッセージボックスを表示します。

    説明が不自由かもしれませんが読み取ってください。

    キャンセル

  • TN8001

    2020/07/30 23:37

    MonthCalendarには「選択していない状態」がなさそうで、
    通常今日の日付が選択されていると思うのですが、今日が登録済みの場合次の日になるんでしょうか?(1か月先まで埋まっていても?^^;
    範囲選択ができますが、登録日にかかったらどうなるのでしょう?

    いっそElementHostでWPFのCalendarを埋め込んだほうが簡単かもしれません(×で選択不可になるBlackoutDatesがあります)

    キャンセル

  • 退会済みユーザー

    2020/10/05 03:32

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

回答 1

0

ElementHostに言及したので、簡単な例を回答します。

Calendar クラス (System.Windows.Controls) | Microsoft Docs

ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Docs
でホストします。

既に登録されている日付を選択するとメッセージボックスが表示される

そもそも選択不可なのとダイアログをポンポン出すのは趣味でないので、「選択しないと登録ボタンが押せない」というシナリオにしました。

注意
以下を「参照の追加」で入れる必要があります。
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration

日付選択後なぜかボタンを2回押す必要があります^^;
正確にはカレンダー以外のフォームのどこかをクリックしてからでないとボタンが反応しない。
解決法は探しきれませんでした。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Integration;

namespace Questions281450
{
    public partial class Form1 : Form
    {
        private Button button1;
        private System.Windows.Controls.Calendar calendar1;

        public Form1()
        {
            InitializeComponent();

            button1 = new Button
            {
                Text = "登録",
                Enabled = false,
                Location = new Point(200, 330),
            };
            button1.Click += (s, e) => MessageBox.Show($"{calendar1.SelectedDate?.ToString("yyyy/MM/dd")}を登録");
            Controls.Add(button1);

            // [WPF]カレンダーコントロール
            calendar1 = new System.Windows.Controls.Calendar
            {
                SelectedDate = null,
                IsTodayHighlighted = false,
                //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate,
                //FirstDayOfWeek = DayOfWeek.Sunday,
                // 背景色・枠色以外の色変更は可能だが簡単ではない^^;
                //Background = System.Windows.Media.Brushes.LightPink,
                //BorderBrush = System.Windows.Media.Brushes.Blue,

            };
            calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null;

            foreach(var d in getCSV())
            {
                // 選択不可日を追加
                calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d));
            }
            // 過去を一括選択不可にする
            //calendar1.BlackoutDates.AddDatesInPast();

            // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように)
            var viewbox = new System.Windows.Controls.Viewbox
            {
                Stretch = System.Windows.Media.Stretch.Fill,
                Child = calendar1,
            };

            // [WinForms]WPFコントロールをフォームに追加するコントロール
            var elementHost1 = new ElementHost
            {
                Child = viewbox,
                Size = new Size(300, 300),
            };
            Controls.Add(elementHost1);
        }

        // CSVから取得したつもりで
        private DateTime[] getCSV()
        {
            var d = DateTime.Now.Date;
            return new DateTime[]
            {
              d.AddDays(-7),
              d.AddDays(-1),
              d.AddDays(1),
              d.AddDays(7),
            };
        }
    }
}

アプリ画像

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る