カテゴリー
Tech

[C#備忘録]複数のNumericUpDownから最適値を探す | AmpiTa Project

 NumericUpDownは数値をコントロールできるWindows Visual Studio 2022の標準ツールです。

 横に付属しているUpボタン、Downボタンで操作できるほか、テキスト欄に直接入力もできます。

 今回は、これを複数個設置したフォームにおいて、現在の状況を反映したものはどれであるか探すコードを書いてみました。




実装先はカウントダウンタイマー

 今回のNumericUpDownなどの実装先はプレゼンテーション・タイム・キーパー(PTK)です。


 予鈴機能が3個あり、現在の状態が予鈴の適用を受ける段階にあるかどうかを調べることが目的です。

Presentation Time Keeper (by AmpiTa)



コード

 処理対象の予鈴には『分』と『秒』の2つのNumericUpDownが備わっています。

 最初に、処理を簡単にするために変数に代入します。ラジオボタンがON側なら秒数を、Off側なら0を代入するコードです。

Presentation Time Keeper (by AmpiTa)
if (rdb1_On.Checked == true) 
{
    int_Bell_A = decimal.ToInt32(numUD_1_Min.Value * 60 + numUD_1_Sec.Value); 
}
else
{
    int_Bell_A = 0; 
}

 上記の要領でint_Bell_A、int_Bell_B、int_Bell_Cの3つの変数に予鈴の予定を秒単位で代入しておきます。

 次に、これらの値を格納する辞書(Dictionary)を作ります。

 Keyには予鈴1に1、予鈴2に2、予鈴3に3を格納します。Valueには変数(int_Bell_A, int_Bell_B, int_Bell_C)を代入していきます。

 辞書に格納された値をリスト化し、『OrderBy』で順番に確認していきます。逆順の場合は『OrderByDescending』で確認します。

 今回は小さい順に見ていき、現在の時刻(秒)と比較して、現在の時刻の方が小さければマッチングしたということで foreach から抜け出します。
 今回の目的は予鈴の時刻を過ぎているのかどうか、例えば予鈴が60秒に設定されていて、現在が55秒であれば予鈴時刻を過ぎているので、その予鈴を適用する時間になっています。
 小さい順に見ていくことで、例えば予鈴1が120秒、予鈴2が60秒、予鈴3が180秒であった場合、現在が55秒であれば適用される予鈴は2番なので、小さい方から見ていきます。
 もし、時間超過であれば OrderByDescending を使うことになると思います。

 処理の結果を記録するための変数(int_Case_Code)を用意し、処理開始時は『99』でスタートします。

if (decimal_Set_Seconds > 0)
{
    int_Case_Code = 99;
    Dictionary<int, int> dic_Bell = new Dictionary<int, int>();
    dic_Bell.Add(1, int_Bell_A);
    dic_Bell.Add(2, int_Bell_B);
    dic_Bell.Add(3, int_Bell_C);

    IOrderedEnumerable<KeyValuePair<int, int>> dict_Sorted_K_V = dic_Bell.OrderBy(pair_Key_Value => pair_Key_Value.Value);
    foreach (var result_Pair in dict_Sorted_K_V)
    {
        if (result_Pair.Value >= decimal_Set_Seconds) 
        {
            int_Case_Code = result_Pair.Key; break; 
        }
    }
}
else
{
    int_Case_Code = 0; 
}

 処理結果は変数(int_Case_Code)で判断できるため、 Switch で判別していきます。

 予鈴がすべてオフの場合や残時間が0秒以下の場合は int_Case_Code は 0 です。ラベルを赤く表示します。

 予鈴がマッチした場合は、その予鈴の指示が出ているRGBに合わせます。これで処理は終わりです。

switch (int_Case_Code)
{
    case 0:
        lbl_Dsp.ForeColor = Color.Red;
    break;

    case 1:
        lbl_Dsp.ForeColor = Color.FromArgb((int)numUD_A_R.Value, (int)numUD_A_G.Value, (int)numUD_A_B.Value); if (int_Bell_On_Off_Code==1) { await Bell_1_Async(); }
    break;

    case 2:
        lbl_Dsp.ForeColor = Color.FromArgb((int)numUD_B_R.Value, (int)numUD_B_G.Value, (int)numUD_B_B.Value); if (int_Bell_On_Off_Code == 1) { await Bell_2_Async(); }
    break;

    case 3:
        lbl_Dsp.ForeColor = Color.FromArgb((int)numUD_C_R.Value, (int)numUD_C_G.Value, (int)numUD_C_B.Value); if (int_Bell_On_Off_Code == 1) { await Bell_3_Async(); }
    break;

    default:
        lbl_Dsp.ForeColor = Color.FromArgb((int)numUD_R.Value, (int)numUD_G.Value, (int)numUD_B.Value);
    break;
}     




おわりに

 今回は残秒数と予鈴の関係をチェックするコードを書いてみました。あまり使い道はないと思います。ゆえに、ネット上にヒントが少なかったので、色々とアレンジしてみたらできた、という程度のコードなので、もっとスマートな方法が存在するのではないかと思います。




関連記事