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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

4回答

249閲覧

if(!c7)より短く書く方法が分からなくて困っています。

kodokudane

総合スコア12

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2019/02/04 11:05

編集2019/02/04 14:09

前提・実現したいこと

原始的なやり方なのでコードが長くなるので短くしたいです。
水分補給を管理するアプリを作っています。8時なると7時のチェックボックスにチェックが入ります。自分でチェックを入れる(水分補給したらチェックする)と加点されますが、プログラムにチェックを入れられると減点するアプリです。

"c7"は7時のチェックボックスを管理するためのフラグです。< 演算子によって8時になったら"c7"がfalseになります。
c7がfalseの時にチェックを入れたいです。if(!c7)だとifを18個書かないといけないのでみっともないです。短くする方法を教えてください。
最近学び始めた独学高校生なので知識が乏しいですが頑張りたいと思っています。回答よろしくお願いします。

C#

C#

1 public MainWindow() 2 { 3 InitializeComponent(); 4 5 DispatcherTimer timer = new DispatcherTimer(); 6 timer.Tick += timer_Tick; 7 timer.Interval = new TimeSpan(0, 0, 1); //1000ミリ秒に一度呼び出す。 8 timer.Start(); 9 } 10 11 private void timer_Tick(object sender, EventArgs e) 12 { 13 14 DateTime dt = DateTime.Now; 15 int H = dt.Hour; //時 16 int M = dt.Minute; //分 17 Hfirudo = H; //時 18 jikoku.Text = H + "時" + M + "分"; 19 20 bool c7 = 8 < Hfirudo; /c7 = チェックボックス(7)の管理に使うフラグ 21 bool c8 = 9 < Hfirudo; 22 bool c9 = 10 < Hfirudo; 23 bool c10 = 11 < Hfirudo; 24 bool c11 = 12 < Hfirudo; 25 bool c12 = 13 < Hfirudo; 26 bool c13 = 14 < Hfirudo; 27 bool c14 = 15 < Hfirudo; 28 bool c15 = 16 < Hfirudo; 29 bool c16 = 17 < Hfirudo; 30 bool c17 = 18 < Hfirudo; 31 bool c18 = 19 < Hfirudo; 32 bool c19 = 20 < Hfirudo; 33 bool c20 = 21 < Hfirudo; 34 bool c21 = 22 < Hfirudo; 35 bool c22 = 23 < Hfirudo; 36 bool c23 = 24 < Hfirudo; 37 bool c24 = 25 < Hfirudo; 38 39 if (!c7) 40 { 41 チェックボックスにチェック 42 }

チェックボックス

イメージ説明

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

vs2017 WPF

bochan2👍を押しています

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

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

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

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

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

papinianus

2019/02/04 11:41

配列を使いたいのですが、回答するにあたって、もうちょっと全体像がわかりたいです。コードも動きも。タイマーかなにかで動く部分なんですかね?説明を補足してほしいです。
len_souko

2019/02/04 13:42

↑それは質問を編集して書いてください。こちらは既定では閉じられているというのと、コード表示ができないので気づかない人が多く、気づいても見づらくて回答者が見間違いやすいです。
kodokudane

2019/02/04 13:49

編集しました。ありがとうございます。
guest

回答4

0

CheckBox に限らず、FrameworkElement を継承するコントロールは Tag プロパティを持っています。このプロパティは Object 型なので、何でも入れておくことができます。7時の CheckBoxTag に、「8時になったら検査する」ことを覚えさせておくとします。すると、毎正時に、すべての CheckBoxTag を見て、「今、検査するべきか?」を取得し、検査することができるのではないでしょうか。

投稿2019/02/04 11:51

Q71

総合スコア995

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

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

kodokudane

2019/02/04 12:18

回答ありがとうございます。回答いただいた情報をもとにobjectの使い方を調べます。
guest

0

単純に配列にしては?
(ビルドしていないので、コンパイルがエラーになるかも)

// c7~c24を配列にする bool[] c7to24 = new bool[18]; int index = 0; for (int intHour = 8; intHour <= 25; intHour++) { // 配列の添え字(index)は、0から17の18個 index = intHour - 8; c7to24[index] = intHour < Hfirudo; } // チェックボックスも配列にする Checbox[] ChecboxArray = new Checbox[] { チェックボックス7時 , チェックボックス8時 , ・ ・ ・ }; for (index = 0; index < c7to24.length; index++) { if (c7to24[index] == false) // !c7to24[index] と同じ { // チェックボックスにチェック ChecboxArray[index].Checked = true; } }

c7からc24はチェックボックスにチェックする以外に使わないのであれば、
チェックボックスの配列だけで、できそう。

// チェックボックスの配列にする Checbox[] ChecboxArray = new Checbox[] { チェックボックス7時 , チェックボックス8時 , ・ ・ ・ }; int index = 0; for (int intHour = 8; intHour <= 25; intHour++) { // 配列の添え字(index)は、0から17の18個 index = intHour - 8; bool c = intHour < Hfirudo; if (c == false) { // チェックボックスにチェック ChecboxArray[index].Checked = true; } }

投稿2019/02/05 07:36

sugar_yas

総合スコア135

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

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

0

どういう組み方をするのか分からないけれど・・・
自分ならクラスを定義してその中で時刻(~時のみ)と自分が推したかどうかと時間切れでチェックしたかどうかとまだ押してないし時間も来てないの状態を保持するようするかなぁ
んで、それをListに格納して初期化時は開始時刻(質問のソースだと7時なので7)から終了時刻(質(ryだと24)でループして時刻情報を設定かな
enumあたりから名前がおかしいけどコメント省略のためにやった、反省はしてない

C#

1 2// enum名や値は自分で好みに合わせて 3public enum 水やったんか 4{ 5 まだやで, 6 じぶんでやったで, 7 間に合わんかった, 8} 9 10public class 水やりState 11{ 12 public int Hour {get;} 13 public 水やったんか 水やりどない {get; set; } = 水やったんか.まだやで; 14 public 水やりState(int h) 15 { 16 Hour = h; 17 } 18} 19 20// windowクラスのメンバ 21private List<水やりState> 水やりStatus = new List<水やりState>(); 22 23// 初期化時に 24// 7と24は定数切るなり画面入力にするなりご自由に 25for(int i = 7; i <= 24; i++) 26{ 27 水やりStatus.Add(new 水やりState(i); 28} 29 30// タイマーイベントでのチェック時 31var nowH = DateTime.Now.Hour; 32if(水やりStatus.Any(m => m.Hour == nowH && m.水やりどない == 水やったんか.まだやで)) 33{ 34 // 時間が過ぎてて水やりしたかどうかの指定が無い場合は時間切れで乙る 35 水やりStatus.First(m => m.Hour <= nowH && m.水やりどない == 水やったんか.まだやで).水やりどない = 水やったんか.間に合わんかった; 36} 37

投稿2019/02/04 15:32

len_souko

総合スコア1348

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

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

0

Q71さんの回答よりTagプロパティなる便利なものを知ったので、勉強がてら使ってみました。

特定のコンポーネント内のすべての子要素処理をするときは、その入れ物にx:NameをつけてChildrenプロパティから取得するのをよく使います。
これにTagを組み合わせると、自動生成した場合でもそれぞれを容易に識別できるので便利ですね。

C#

1// MainWIndow.xaml.cs 2public partial class MainWindow : Window 3 { 4 private int MinTime = 7; 5 private int MaxTime = 24; 6 private DispatcherTimer CheckTimer; 7 8 public MainWindow() 9 { 10 this.InitializeComponent(); 11 12 // タイマーの初期化 13 this.CheckTimer = new DispatcherTimer(); 14 this.CheckTimer.Tick += this.CheckTimer_Tick; 15 this.CheckTimer.Interval = new TimeSpan(0, 0, 1); 16 this.CheckTimer.Start(); 17 } 18 19 private void Window_Loaded(object sender, RoutedEventArgs e) 20 { 21 // チェックボックスの自動生成 22 for (int i = this.MinTime; i <= this.MaxTime; i++) 23 { 24 CheckBox chekcbox = new CheckBox 25 { 26 Content = string.Format("{0}時", i), // 表示テキスト 27 Tag = i // 時間のタグ付け 28 }; 29 30 // チェックボックスをCheckBoxContainerに追加 31 this.CheckBoxContainer.Children.Add(chekcbox); 32 } 33 } 34 35 private void CheckTimer_Tick(object sender, EventArgs e) 36 { 37 DateTime now = DateTime.Now; 38 39 // 時刻表示更新 40 this.Clock.Text = now.ToString("H時m分"); 41 42 // CheckBoxContainer内のチェックボックスそれぞれに処理 43 foreach (object child in this.CheckBoxContainer.Children) 44 { 45 if (child is CheckBox checkBox) // objectからCheckBoxに型変換 46 { 47 if (checkBox.Tag is int time) // タグ付けした時間を取得 48           { 49 if (time < now.Hour) 50 { 51 if(checkBox.IsChecked == true) 52 { 53 // ポイント増加 54 } 55 else 56 { 57 checkBox.IsChecked = true; 58 checkBox.IsEnabled = false; 59 // ポイント減少 60 } 61 } 62 } 63 } 64 } 65 } 66 }

XAML

1<!-- MainWindow.xaml --> 2<Window x:Class="CheckManager.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="400" Width="800" Loaded="Window_Loaded"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="Auto"/> 12 <RowDefinition Height="300"/> 13 </Grid.RowDefinitions> 14 15 <TextBlock x:Name="Clock" 16 Margin="5" FontSize="20"/> 17 18 <WrapPanel x:Name="CheckBoxContainer" Grid.Row="1" 19 Orientation="Vertical"> 20 <WrapPanel.Resources> 21 <Style TargetType="CheckBox"> 22 <Setter Property="Margin" Value="5"/> 23 <Setter Property="FontSize" Value="16"/> 24 <Setter Property="VerticalContentAlignment" Value="Center"/> 25 </Style> 26 </WrapPanel.Resources> 27 </WrapPanel> 28 </Grid> 29</Window> 30

投稿2019/03/09 13:53

編集2019/03/09 14:15
cpthgli

総合スコア76

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問