SerialPort DataReceived イベント ハンドラーから UI を更新したいと考えています。イベントハンドラーがフォームとは別のスレッドで暗黙的に実行されていたため、単にUIを更新するのではなく、問題を発見しました...
myLabel.Text = "Some text";
...次のアプローチを取る必要がありました。
InvokeControlAction<Label>(myLabel, lbl=> lbl.Text= "Some text");
...
public static void InvokeControlAction<t>(t cont, Action<t> action) where t : Control
{
if (cont.InvokeRequired)
{
cont.Invoke(new Action<t, Action<t>>(InvokeControlAction),
new object[] { cont, action });
}
else
{
action(cont);
}
}
これまでのところ良い...ただし、今は ToolStripStatusLabel を更新したい - 同じアプローチを使用すると、「ToolStripStatusLabel と Forms.Control の間に暗黙的な参照変換はありません」というエラーが発生します。
私が読んだことから、問題は ToolStripStatusLabel を呼び出すことができないという事実に起因します。
では、これをどのように処理するのが最善でしょうか?
注: 代理人などは私の現在の能力の限界にあるため、解決策と一緒に説明をいただければ幸いです。
更新 1:明確にするために、InvokeControlAction に相当する ToolStripStatusLabel を作成しようとしましたが、呼び出しメソッドがないため、これは機能しません。
結果:私のソリューションを再検討した後、ジミーが最初に提案したように、拡張メソッドとして実装しました。
静的なExtensionMethodクラス (独自の「ExtensionMethods」名前空間内) を作成し、InvokeOnToolStripItem メソッドに追加し、「using ExtensionMethods;」を追加しました。元のクラスでディレクティブを作成し、次のようにメソッドを呼び出しました。
tsStatusValue.InvokeOnToolStripItem(ts => ts.Text = "ALARM signal received");