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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

7160閲覧

windows フォーム での文字表示ツールについて

GuielNo4

総合スコア88

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2017/05/01 13:01

編集2017/05/01 18:02

###前提・実現したいこと
System.Timers でイベントを発生させて、イベント回数を文字列で表示ささせようとしているのですが、
うまくいかないためアドバイスを頂きたく、
質問させていただきました。

###発生している問題・エラーメッセージ
windows form でのコーディングを今日始めました。
まず、System.Timers でイベントを発生させて、
イベント回数を文字列で表示するところから始めています。
webでいろいろ調べるのですが、文字を表示するには
「テキストボックス」利用するという記述が多く見られましたが、
AccessibilityObjectがリードオンリーのため、
textBox1.Text = counter.ToString();
でエラーになります。

そもそもタイマーイベントに登録したメソッドから、
「テキストボックス」にアクセスしようとしたこと自体が間違いではないか?と考えました。

「windowsフォームとは何か?」を理解することから始める必要があるのかもしれませんが、
今の段階で、そこに時間をかけたくないので、
とっかかりとして、
「System.Timers でイベントを発生させて、イベント回数を文字列で表示する」ことに関して、いい方法を記しているサンプルコードのあるページをご存知の方がいらっしゃいましたら、
アドバイスいただけると助かります。

よろしくお願い致します。

【追記】
コードを追記します。

using System; using System.Timers; using System.Windows.Forms; partial class Form1 { // デフォで作成される Dispose メソッド等は省略 ... private System.Windows.Forms.TextBox textBox1; } public partial class Form1 : Form { private static System.Timers.Timer timer; public Form1() { InitializeComponent(); // タイマーの生成 timer = new System.Timers.Timer(); timer.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer); timer.Interval = 5; // タイマーを開始 timer.Start(); return; } public void OnElapsed_TimersTimer(object sender, EventArgs e) { textBox1.Text = "test"; <---------------------------------------------エラー発生。 return; } }

エラー内容
型 'System.InvalidOperationException' の例外が System.Windows.Forms.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした。
追加情報:有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。

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

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

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

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

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

Zuishin

2017/05/01 13:23

エラーの出るソースとエラーメッセージを書いてください。
GuielNo4

2017/05/01 17:05 編集

質問にコードとエラー内容を追加しました。 よろしくお願い致します。
guest

回答1

0

ベストアンサー

質問の問題点への直接の回答ではありませんが、
Windows フォームアプリケーションであればSystem.Windows.Forms.Timerを使ったほうがスマートです。

1. Timer を追加します

  1. Timer を選択する
  2. マウスのアイコンがタイマーに変わったら左クリックする
  3. timer1 が追加される

2. timer1のプロパティを以下のように設定します

3. timer1 の Tick イベントのプログラムを書きます

timer1 のアイコンをダブルクリックすると自動的に Tick イベントメソッドが作成されます。

CSharp

1private void timer1_Tick(object sender, EventArgs e) 2{ 3 textBox1.Text = Guid.NewGuid().ToString(); 4}

実行結果

1秒ごとにGUIDが表示されます

投稿2017/05/01 13:22

編集2017/05/01 13:27
aglkjggg

総合スコア769

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

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

GuielNo4

2017/05/01 16:06 編集

親切な図付きアドバイスありがとうございます。 今日始めたばかりなのでとても助かります。 こちらの都合にて心苦しく…、5msの定期処理を想定して、System.Timers の方を利用しているのですが、 https://garafu.blogspot.jp/2015/01/c-timer.html このページより、System.Timers は非同期(多分スレッドセーフではない?)ようなので、 ひょっとして以下の推測が当たってたりしますでしょうか? ・イベント設定元のクラスに「カウンタ変数」と 「テキストボックス」を持たせています。 ・System.Timers のイベントハンドラに渡すメソッド内で、「カウンタ変数」「テキストボックス」は 参照はできるが、値の設定はできない。 →何故ならそもそもwindows form でツールオブジェクトはスレッドセーフで設計されていないから? 推測が正しいか間違えているか、アドバイス頂けると助かります。 よろしくお願いいたします。
GuielNo4

2017/05/01 17:18

質問にコードとエラー内容を追記致しました。 よろしくお願い致します。
aglkjggg

2017/05/01 17:45 編集

追記されたプログラムをそのまま実行しましたがこちらの環境では再現しませんでした。 スレッドセーフな呼び出しとしてInvokeを利用してみて下さい。 https://gist.github.com/anonymous/6a32897c4a4dada6e76126b274b16254 また、直接関係はありませんが C# の書き方としてそれぞれのメソッドの終わりに return; は不要です。
GuielNo4

2017/05/01 18:42 編集

回答ありがとうございます。 サンプルコードありがとうございました。 1つ気が付いたことがあります。  https://garafu.blogspot.jp/2015/01/c-timer.html を参考に、 コードを修正してみたのですが、 「System.Timers に EventArgs はない」というエラーになってしまいました。 記載漏れにて申訳ないのですが、.NET Framework 3.5 で行っているのですが、 ひょっとして 3.5 では無理なのかもしれないという懸念も念頭に置いていろいろ試してみます。 Invoke のアドバイスありがとうございます。 この方法で期待通りの動作をするようになりました。 これで何故大丈夫なのかは、これから勉強したいと思います。 ありがとうございました。 ベストアンサーとさせて頂きたいと思います。 returnはごめんなさい。ブレイクポイントとして止めるためにいれたものでした。 サンプルコードとしては不適切でした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問