Blazor01

BlazorでのWebアプリケーション開発手法1【C#】B06_最新の値でデータを更新する

ここまでの計測画面は、計測値・計測日時・計測場所のいずれも固定値を表示しているだけでした。本レクチャーでは、ボタンを押すたびに最新の計測値と計測日時がリアルタイムに切り替わるように機能を追加していきます。

Measureメソッドを作成する

まず、画面にボタンを配置し、そのボタンを押したときに「今の計測値」と「今の時間」が設定されるようにしたいと思います。そのための処理をまとめるメソッドとして、MeasurePage.razorの@codeブロックに private void Measure() を追加します。

図1 MeasurePage.razorのcodeブロックにMeasure()メソッドを追加したところ

ランダムな値を計測値として使う

計測処理の中身ですが、実際のセンサー値の代わりに、ここでは例としてランダムな値を使うことにします。乱数を生成するため、private Random _random = new Random(); というフィールドを追加します。

図2 Randomクラスのフィールド _random を追加したところ

続けて、Measure()メソッドの中で _random.NextSingle() を呼び出し、0以上1未満のランダムな小数値(float)を取得します。

図3 _random.NextSingle() でランダムな値を取得するコード

取得した値は var measureValue として一旦受け取り、これを画面表示用の文字列フィールド _measureValue に代入します。

図4 取得したmeasureValueを_measureValueへ代入する途中のコード

ただし、NextSingle()の戻り値をそのまま代入すると小数点以下が長く表示されてしまいます。そこで Math.Round 関数を使って小数点以下2桁に丸め、末尾に ” m/s” という単位の文字列を連結しておきます。

図5 Math.Round適用前のコード(丸め処理を追加する前)

図6 Math.Round(measureValue, 2) + ” m/s” で丸めと単位付与を行うコード

計測日時を設定する

計測日時を表す _measureDate には、DateTime.Now(現在日時)を代入します。そのままだと日時の表示形式が読みづらいため、ToString()に書式文字列を渡してフォーマットをかけておきます。

図7 _measureDate = DateTime.Now; を追加したコード

図8 DateTime.Now.ToString()で日時の書式を指定したコード

初期値を設定する

計測場所については、今回は「後から入力できるようにする」という将来の拡張は行わず、とりあえず “神戸” の固定値にしておきます。また、計測値と計測日時の初期値(アプリ起動直後、まだ一度も計測していない状態の表示)は “–” にしておきます。これで、Measure()を呼び出すと _measureValue と _measureDate が新しい値に置き換わる、という実装になりました。

図9 _measureValueと_measureDateの初期値を”–“にし、Measure()メソッドが完成した状態

private string _measureValue = "--";
private string _measureDate = "--";
private string _measureArea = "神戸";
private Random _random = new Random();
 
private void Measure()
{
    var measureValue = _random.NextSingle();
    _measureValue = Math.Round(measureValue, 2) + " m/s";
    _measureDate = DateTime.Now.ToString("yyyy/MM/dd HH:mss:ss");
}

計測ボタンを配置する

Measure()メソッドを作成できたので、次はこれを呼び出すボタンを画面に配置します。ボタンを押したときの処理は、以前のレクチャーで扱ったCounter.razorのボタン(@onclick=”IncrementCount” となっているもの)から流用できます。Counter.razorのボタン要素をコピーし、計測場所の下に貼り付けます。

図10 Counter.razorのボタンをコピーしてMeasurePage.razorに貼り付けた直後(IncrementCountのまま)

貼り付けた直後は @onclick=”IncrementCount” のままなので、これを @onclick=”Measure” に書き換えます。

図11 @onclickの参照先をIncrementCountからMeasureに書き換えたコード

さらに、ボタンの表示テキスト「Click me」も「計測」に書き換えます。ここまでの変更を反映して実行してみると、サイドメニューの「計測」画面に「計測」ボタンが表示され、計測値・計測日時は初期値の “–” のままになっていることが確認できます。

図12 ボタンの表示テキストを「計測」に書き換えた、MeasurePage.razorの最終的なマークアップ

図13 アプリを実行し、サイドメニューに「計測」画面が表示されたところ

図14 計測画面を開いた直後。計測値・計測日時はまだ初期値の”–“のまま

@rendermodeの指定を忘れずに

ここで「計測」ボタンを押しても、画面の表示が変わりません。これは以前のレクチャーでもお伝えした、Counter.razorの先頭にある @rendermode InteractiveServer の記述が MeasurePage.razor 側にはまだ無いことが原因です。

図15 参考:Counter.razorの先頭にある@rendermode InteractiveServerの記述

@rendermode InteractiveServer は、ユーザーの操作(ボタンクリックなど)に応じてサーバーと通信し、画面を更新するかどうかを指定するものです。この記述を入れ忘れると、毎回「あれ?なんで反映されないのかな?」とハマってしまいがちなので、ユーザー操作を伴うページでは必ず入れておくようにしてください。MeasurePage.razorの先頭にも同様に @rendermode InteractiveServer を追加します。

図16 MeasurePage.razorの先頭に@rendermode InteractiveServerを追加した状態

この状態で改めて実行し、「計測」ボタンを押すと、今度はきちんと計測値と計測日時が更新されます。押すたびに値が変わっていくことも確認できます。

図17 @rendermode追加後、「計測」ボタンを押して値が更新されたところ

図18 「計測」ボタンを複数回押し、そのたびに計測値・計測日時が変化することを確認したところ

まとめ

今回は、これまでのレクチャーで学んできた「段落での表示」と「変数の単方向データバインド」の内容を応用しました。単方向データバインドとは、プログラム側で更新した値を画面に表示するだけの一方向の連携であり、ユーザーが入力した値を受け取る仕組み(双方向のバインド)はまだ扱っていません。それでも、プログラム側で変更した値がボタン操作をきっかけに画面にカチャッと反映される、という動きを確認できました。ここまでのCounter画面での学習内容を応用することで、計測画面は今回のような形に仕上がります。

BlazorでのWebアプリケーション開発手法1【C#】

A01_はじめに
A02_バージョンの確認
A03_プロジェクトの作成
A04_アプリの実行
A05_サンプルプログラムの構成
A06_Razorコンポーネント
A07_Razor構文
A08_@pageでURLを指定する
A09_@rendermode
A10_PageTitle
A11_HTMLの見出し
A12_pタグ
A13_単方向データバインド
A14_単方向データバインドの詳細
A15_Bootstrap
A16_ボタンクリックイベント
A17_イベント引数の受け取り方
A18_ここまでのまとめ
B01_新しいWebページを追加する方法
B02_サイドバーから画面を表示する
B03_サイドバーのアイコンを変更する方法
B04_計測値を表示する
B05_変数に置き換える
B06_最新の値でデータを更新する
B07_@usingで通常のC#コードを呼び出す
B08_画面遷移_aタグ
B09_画面遷移_aタグの見た目をボタンにする
B10_画面遷移_NavigationManagerでの遷移
B11_画面間のパラメータの受け渡し方法
B12_EscapeDataStringでエスケープする
B13_複数のパラメータを渡す
B14_任意のパラメータにする
B15_string以外の型をパラメータで使う方法
B16_DateTime型をパラメータで渡す方法
B17_引数2個のURLも型指定に変更する
B18_パラメータ属性をつけるときの注意点
B19_OnParametersSet
B20_OnInitialized
B21_OnInitializedが2回通る問題の対応
B22_ブラウザが開いている間の値を記憶する方法
B23_値の受け渡しとしてのProtectedSessionStorage
B24_非同期を想定したUIの制御
C01_一覧表示
C02_非同期での一覧表示
C03_table-striped
D01_入力エリア
D02_双方向データバインド
D03_入力データをリアルタイムで通知する方法
D04_placeholder
D05_入力エリアの横幅の調整
D06_テキストチェンジイベントを拾う方法
D07_プルダウン
D08_プルダウンのbootstrap
D09_プルダウンの選択している値をデータバインドで操作する
D10_プルダウンにリストの値を表示する
D11_プルダウンに未選択行を入れる
D12_プルダウンの入力を禁止する
D13_プルダウンのチェンジイベントを取得する
D14_チェックボックス
D15_チェックボックスにラベルを付ける
D16_複数のチェックボックスを並べる
D17_ラジオボタン
D18_ラジオボタンのデータバインド
D19_ラジオボタンのチェンジイベント
D20_ラジオボタンにbootstrapを適応する