🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Q&A

解決済

2回答

993閲覧

Windowsフォームが思うように表示されない?

zamatec

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

0グッド

0クリップ

投稿2020/12/20 05:29

前提・実現したいこと

WindowsアプリケーションをC#-VisualStudio2013で開発しています。
通常のイベントドリブン式では、正常に表示され、各ボタン押しで所望するアプリを実行していますが、これを人の手に依らず自動で処理しようとプログラムから、例えば、ボタン押し(this.button3.PerformClick();)で進めるようにすると、残りのボタン類やラベルが白色無地になってしまいます。どのようなテクニックで解決できるでしょうか?

発生している問題・エラーメッセージ

会話形式の時は、思うように表示される。イメージ説明
プログラムでボタン押しだと、他のボタンなどが白色無地に。イメージ説明

エラーメッセージ ```:なし。 ### 該当のソースコード this.button3.PerformClick(); ### 試したこと 「Thread.Sleep」や「Shown」、コントロールの「focus」などを試しましたが、うまく表示されません。 ### 補足情報(FW/ツールのバージョンなど) C#-VisualStudio2013で開発。

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

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

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

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

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

Zuishin

2020/12/20 05:31

自分で作ったものならボタンを押さずに処理すればいいのでは?
zamatec

2020/12/20 05:52

ボタンを押さないで、ボタンクリック後の内容である次のステップ(サブのダイアログ画面で、入力処理等)をそのままコーディングして先に進めようとしたのですが、元の画面は白紙無地のままです。見栄えが悪いのです。どうも、他のコントロールを表示させる前に、指定したコマンドボタンの処理に走ってしまっているように思えます。
Zuishin

2020/12/20 05:57

おそらく処理をしている間ウィンドウメッセージを受け付けていないからでしょうね。非同期を使うのが良いと思います。
zamatec

2020/12/20 06:08

回答ありがとうございます。 処理を順次、確実に行い、その間、ロックされていて良いと思っており、非同期より同期処理が良いのでは。と思っていますが、解釈が誤っているのでしょうか?指定するボタンの処理前に画面をすべて表示(白色無地のボタン類)して、その後、ロックさせれば思惑通りなのですが。
Daregada

2020/12/20 06:17

自動で処理するのであれば、フォームやダイアログなどいっさい表示せずに、必要な値の設定や計算などだけ行なえばいいと思います(それらの処理がUIにがっちり結びついていない前提で)。 画面に何か表示されないと不安なら、処理経過を示すラベルかテキストボックス(readonly)に経過を文字列で表示すればいい。
zamatec

2020/12/20 06:32

回答ありがとうございます。 ベーシック・スタンダードな処理方法では、それで良いと思っていますが、それを10倍100倍遅延させながら動的表現で行いたいと思っているのです。 イベントドリブン式では、ボタン類等コントロールが表示されて、次処理に向かえるのに、なぜ、プログラム内で行うと、フォーム内のボタン類等コントロールが非表示になるのか?コードなどのテクニックではなく、どれかのプロパティを設定すれば解決できるように思えるのですが?
guest

回答2

0

this.button3.PerformClick();

というのは、対象のボタンにクリックの指示を出している、だけです。
そこに、Thread.Sleepなんかで待ちを作ってしまうと、ボタンのクリックの処理ができなくなります

すなおに、イベントドリブンで作りましょう。

投稿2020/12/20 05:44

y_waiwai

総合スコア88040

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

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

zamatec

2020/12/20 05:59

回答ありがとうございます。 イベントドリブンで作ったプログラムは、すでに完成させています。それをスケジューラー等で「一気に自動処理したい!!」が主目的なのです。画面にこだわらなければ、目的は達成できそうですが、画面もパッパッと正常に表示させたいわけです。(欲張りな点です)
y_waiwai

2020/12/20 06:11

別スレッドを立てて、そこらへんコントロールすればいいんですが、そこらへんのキーワードでググって挑戦してみてください
guest

0

自己解決

皆さんのご指南通り、非同期で組み解決できました。(Task t = Task.Run(() =>・・・)
簡単に手抜きして処理しようとしたのですが、結果的に時間を要しました。
しかし、これも経験で、以後進化できます。
今回、初めて質問を利用しましたが、今後、ぜひ、活用したいと思います。
ありがとうございました。

投稿2020/12/21 00:39

zamatec

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問