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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

4回答

4990閲覧

C# WindowsFormのサブフォームについて

kurosuke___

総合スコア217

C#

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/01/22 17:44

編集2020/01/23 00:02

WindowsFormのメインフォーム内で別のフォームのインスタンスを作成してShowメソッドを呼び出してしまうと、メインフォームにフォーカスを戻すことができません。
ログウィンドウとして常にサブフォームを出しておきたいといった場合、どのようにすれば良いでしょうか。
重い処理の最中にそのサブウィンドウ内のTextBoxコントロールのTextプロパティを更新していくといった使い方をしたいと思っています。

解決済み

C#

1 LoggingForm loggingForm = new LoggingForm(this); 2 loggingForm .Show();

環境
Windows10
CPU Ryzen7 3700
RAM 54GB
GPU RTX2080
MB MSI X570 GAMING PLUS

IDE: Rider EAP

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/22 22:25

そもそもの目的は「重い処理」を実行するとそれが終わるまで UI がフリーズするからそれを何とかしたい (サブウィンドウでプログレスを表示したい) と言うことですか? もしそうだとすると、XY問題ということですけど。
kurosuke___

2020/01/22 23:23

そうです。 >>ログウィンドウとして常にサブフォームを出しておきたいといった場合、どのようにすれば良いでしょうか。
Zuishin

2020/01/22 23:30

フォーカスをメインフォームに移せます。回答者の手元で問題が再現する最小のコードを新規作成して掲載すると解決が早いでしょう。
退会済みユーザー

退会済みユーザー

2020/01/22 23:36

プログレスを表示するのに別フォームを出すのは必須ですか?
guest

回答4

0

重い処理の最中にそのサブウィンドウ内のTextBoxコントロールのTextプロパティを更新していくといった使い方をしたいと思っています。

データバインドを使います。

WindowsFormのメインフォーム内で別のフォームのインスタンスを作成してShowメソッドを呼び出してしまうと、メインフォームにフォーカスを戻すことができません。

状況がわかりません。Showメソッドに親フォームを渡せば、子フォームが必ず前になりますが、フォーカスは移ります。もしかして、重い処理の最中でしょうか。

15分考えてわからないから聞くのは良いですが、質問文は1時間以上推敲しながら作ってください。

投稿2020/01/22 23:38

Q71

総合スコア995

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

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

kurosuke___

2020/01/22 23:48

回答ありがとうございます。 データバインドですか、なるほどです。 推測するのは良いですが勝手に決めつけないでくださいね。 あと1000行以上あるわけじゃないので質問文はちゃんと読んでください。 >>ログウィンドウとして常にサブフォームを出しておきたいといった場合、どのようにすれば良いでしょうか。 私の質問文が完璧だとは全く思いませんし、抽象的で分からないのでしたら申し訳ないですが、その悪意を感じる決めつけは不快なのでやめてください。
Q71

2020/01/23 00:01

はい、ログを表示するウィンドウを出しておきたい、とは書いてあります。 そのサブフォームをいつ出すのか Showメソッドの引数は? そもそもShowメソッドをオーバーロードしているか サブフォームを表示した途端、問題の現象なのか、それとも重い処理の最中なのか 重い処理のトリガーは? など、不明なことが多すぎます。 「15分考えて」は、テラテイルのコピーです。
kurosuke___

2020/01/23 00:11

なるほど、たしかにそう言われると私のこの質問では回答コストが高いですね。 申し訳ありません。以後気をつけます。
Q71

2020/01/23 06:19

重い処理の実行中のログだということですが、メインスレッドの外からコントロールを操作しようとしていませんか?本来なら、例外が吐かれますが、たまたま動いてしまうことがあります。 Thread.CurrentThread.ManagedThreadId だったかな?を確認し、1以外ならInvoke が必要です。
guest

0

自己解決

各所で紹介されているコードと同じようなコードなのに変だと思い、RiderではなくVisualStudioでソリューションを開いたら期待した動作になりました。
お騒がせしました。

投稿2020/01/22 23:35

kurosuke___

総合スコア217

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

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

Zuishin

2020/01/22 23:44

回答者をからかってるんですかね。
kurosuke___

2020/01/22 23:50

そんな暇人ではありません。 なぜそのように思うのですか? なにが不満なんですか?
Zuishin

2020/01/22 23:57

同じコードをコンパイルしてコンパイラの差でそこまで違う挙動になるのは信じがたいことです。からかっているのでなければ他の人の手元で再現できる最小のコードを新しく作って掲載してください。再現する環境も忘れずに。
kurosuke___

2020/01/23 00:06

追記しました。 ちなみにあなた方の様な経験知識豊富な方は尊敬していますしからかうために質問するほど暇でもないし物好きでもありません。 私にはまだ無い経験の上での「信じられない」という感覚だと思いますが、私からしたら「からかってるんですか」といわれてもとても困ります。
退会済みユーザー

退会済みユーザー

2020/01/23 00:17 編集

回答者も時間と労力を使っているのです。それに報いるために、Rider とやらと Visual Studio で何がどう違ったから結果が異なったか説明してください。
Zuishin

2020/01/23 00:19

質問に追記されたソースコードだけではコンパイルできませんが、他のところをすべて補った場合、最低でもクリックすることでフォーカスが移るのが正しい動作です。もしこれだけで再現するのであれば、メーカーにバグ報告できます。いったいどんなバグが紛れ込むとそうなるのかは見当もつきませんから、コンパイラの違いという回答はまだ懐疑的です。 もう少し何かあるなら Rider をインストールして試してみようと思いましたが、どう考えても再現しないようにしか思えません。
kurosuke___

2020/01/23 00:19

それは私も知りたいですし、それが分かれば書いてます。 この結果に不満なのでしょうが私のような初学者には分からないことが多いのも理解していただけませんか。 わからないことが多いからIDE変えてみようくらいのことしか思いつかないんですよ。 変えてみたら意図する挙動になったかそう書いただけです。 IDEの違いで意図と違う挙動を起こすことが全く無いと言うのでしょうか。
Zuishin

2020/01/23 00:21

IDE の違いくらいで起こるような変化には思えないからです。最適化などというレベルではなく、完全に何か意図的に仕込まないとできない挙動と思います。
kurosuke___

2020/01/23 00:22

>Zuishinさん そうですか・・・ 本当にこれはありえないといった挙動なんですね。 ですが私にはどうしたらよいかわかりません。
退会済みユーザー

退会済みユーザー

2020/01/23 00:24 編集

Teratail のスレッドは質問者だけのための QA の場ではなく、技術者同士の情報交換の場ということのようです。そう言う考えに立って、質問者さんにも情報提供してもらえることを期待してます。
kurosuke___

2020/01/23 00:25

明確な原因がわからず皆さんには申し訳ないですが、とりあえず目的の挙動はできたので助かりました。 ありがとうございました。 JetBrains社には一応今回起こったことは報告しておきます。
Zuishin

2020/01/23 00:26

低評価を解除します。
kurosuke___

2020/01/23 00:31

>SurferOnWwwさん なるべく論理的に話そうと思っていますが、回答者さんの一文につい感情的になってしまうことが多くて申し訳ないです。 技術者同士の情報交換の場という考えの上での立ち振舞いはたしかにできていませんね。 意識を改めるきっかけになりました。 お騒がせいたしました。
退会済みユーザー

退会済みユーザー

2020/01/23 00:48

私も低評価を解除しておきます。
dodox86

2020/01/23 00:49 編集

YAmaGNZさんの回答にあるように、一般的なモードレスダイアログにすれば済むはずなのに挙動がおかしいな、と本質問を注視していました。 VisualStudioならWindows FormsについてはForm1.Designer.csのようなフォームの外観を決めるソースファイルが自動で生成されますが、RiderとやらのIDEではオーナーウィンドウとの関係をおかしくするようなコードが吐かれるのかもしれませんね。
dodox86

2020/01/23 00:54

(ちなみに低評価をしているのは私ではありません。ただ質問回答を注視しているだけです)
dodox86

2020/01/23 01:01

> LoggingForm loggingForm = new LoggingForm(this); 一般的にthis(結果的に親かオーナーになるはず) を渡すことは無いと思いますが、これではないでしょうか? Riderとやらが、特殊なコンストラクタを生成しているとか。既定のFormのコンストラクタって、パラメータ無しだったような。 > https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.-ctor?view=netframework-4.8 既に閉じた質問ですし、多くは追及しませんけれども。
kurosuke___

2020/01/23 01:04

考察いただきありがとうございます。 時間をみつけて色々見てみます。
guest

0

新しいフォームを表示するを参照してください。

投稿2020/01/22 22:09

YAmaGNZ

総合スコア10222

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

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

kurosuke___

2020/01/22 23:24

ありがとうございます。 Showメソッドでモードレスになると書かれていますが、フォーカスをメインフォームに移せません。
guest

0

解決済みですが。
気になったので検証してみましたが再現しませんでした。

Riderで作成したソリューションはVisualStudio2019でそのまま読み込み可能なので
Rider/VisualStudio2019の差異で発生しているとは考えにくいですね。

JetBrains Rider 2019.3.1

Build #RD-193.5662.14, built on December 20, 2019

を入れて検証してみましたが以下で問題なくmodeless表示になってました。
※ RiderメニューからのRun/DebugおよびBuild後WinFormsApp1.exeをExplorerから実行

  • 空ソリューション作成
  • Project追加で.Net Core Desktop Application追加。(WinFormsApp1)
    Target Frameworkはnetcoreapp3.1
  • Form2を追加。
  • Form1のMouseDoubleClickイベントを追加し、Form2をインスタンス化後、Show MethodをCallする

  • Form1.cs

C#

1namespace WinFormsApp1 2{ 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void Form1_MouseDoubleClick(object sender, MouseEventArgs e) 11 { 12 Form2 frm = new Form2(); 13 frm.Show(); 14 } 15 }
  • Form1.cs

C#

1namespace WinFormsApp1 2{ 3 public partial class Form2 : Form 4 { 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 } 10}
  • Form1.Designer.cs

C#

1namespace WinFormsApp1 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// Clean up any resources being used. 12 /// </summary> 13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 21 base.Dispose(disposing); 22 } 23 24 #region Windows Form Designer generated code 25 26 /// <summary> 27 /// Required method for Designer support - do not modify 28 /// the contents of this method with the code editor. 29 /// </summary> 30 private void InitializeComponent() 31 { 32 this.SuspendLayout(); 33 // 34 // Form1 35 // 36 this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 37 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 38 this.ClientSize = new System.Drawing.Size(933, 562); 39 this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); 40 this.Name = "Form1"; 41 this.Text = "Form1"; 42 this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDoubleClick); 43 this.ResumeLayout(false); 44 } 45 46 #endregion 47 }
  • Form2.Designer.cs

C#

1namespace WinFormsApp1 2{ 3 partial class Form2 4 { 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// Clean up any resources being used. 12 /// </summary> 13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 21 base.Dispose(disposing); 22 } 23 24 #region Windows Form Designer generated code 25 26 /// <summary> 27 /// Required method for Designer support - do not modify 28 /// the contents of this method with the code editor. 29 /// </summary> 30 private void InitializeComponent() 31 { 32 this.components = new System.ComponentModel.Container(); 33 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 34 this.ClientSize = new System.Drawing.Size(800, 450); 35 this.Text = "Form2"; 36 } 37 38 #endregion 39 } 40}

投稿2020/01/23 01:54

編集2020/01/23 02:20
Y.H.

総合スコア7914

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

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

Y.H.

2020/01/23 02:14

https://teratail.com/questions/236885?reply=true#reply-344598 > Riderとやらが、特殊なコンストラクタを生成しているとか。既定のFormのコンストラクタって、パラメータ無しだったような。 とくに特殊なコンストラクタは生成されてませんね。 Riderでエラー無くBuildできるってことなんで質問者さんが独自で実装しているんでしょうね。 その実装が原因だとしたらVisualStudioで同じソリューションを開いてBuildすると 現象なくなるのが解せなくなりますが。。。
fana

2020/01/23 02:16

> 問題なくModal表示になってました 話がよくわかりませんが,Form2がModalになるなら問題なのでは…?
Y.H.

2020/01/23 02:19

あぁ誤記です。modelessに修正しておきます。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問