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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

4555閲覧

Classの中に 作成したフォーム内のコントロールのイベントで 別のコントロールにアクセスしたい。

kamikazelight

総合スコア305

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/02/01 00:23

編集2019/02/01 00:31

前提・実現したいこと

Class の中でFormを扱いたいです。
その際にForm内のコントロールのイベントも設定したいのですが
イベントを発生させたコントロールにはアクセスできたのですが
その他のコントロールへのアクセス方法が分かりません。

どうしたらいいでしょうか?

該当のソースコード

例えばですが$TxBox1の値が変更されたら$TxBox2の値も変更したいのですが
出来ません。

powershell

1Using NameSpace System.Windows.Forms 2 3Class MyForm 4{ 5 [Form] $Form = [Form]::new() 6 [TextBox] $TxBox1 = [TextBox]::new() 7 [TextBox] $TxBox2 = [TextBox]::new() 8 [SplitContainer] $SplitContainer = [SplitContainer]::new() 9 10 11 12 hidden [scriptblock] $Form_Resize = 13 { 14 [SplitContainer]$SplitContainer = $This.Controls | where { $_.GetType().Name -eq "SplitContainer" } 15 $SplitContainer.Size = $This.ClientSize 16 } 17 18 hidden [scriptblock] $SplitContainer_Resize = 19 { 20 [TextBox]$TxBox1 = $This.Panel1.Controls[0] 21 [TextBox]$TxBox2 = $This.Panel2.Controls[0] 22 23 $TxBox1.Size = $This.Panel1.ClientSize 24 $TxBox2.Size = $This.Panel2.ClientSize 25 } 26 27 hidden [scriptblock] $Change = 28 { 29 <# 30 TxBox1 の値が変更されたら 31 TxBox2 の値も同様に設定したい 32 でも$Thisだと自身しか拾えない 33 #> 34 Write-host $This.Text 35 } 36 37 38 39 MyForm() 40 { 41 $This.Form.Controls.Add($This.SplitContainer) 42 $This.SplitContainer.Panel1.Controls.Add($This.TxBox1) 43 $This.SplitContainer.Panel2.Controls.Add($This.TxBox2) 44 45 $This.Form.Add_Resize($This.Form_Resize) 46 $This.SplitContainer.Add_SplitterMoved($This.SplitContainer_Resize) 47 $This.TxBox1.Add_TextChanged($This.Change) 48 49 } 50 51 [void] ShowDialog() 52 { 53 $This.Form.ShowDialog() 54 } 55} 56 57$Form = [MyForm]::new() 58 59$Form.ShowDialog()

補足情報(FW/ツールのバージョンなど)

Win10

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

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

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

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

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

guest

回答2

0

ベストアンサー

Control.FindForm Method でそのコントロールの所属するフォームを取得できます。みつかったのは Form 型なので、それを MyForm にキャストすれば TxBox2 が使えると思います。

追記

Form を継承してみました。ついでに Anchor を使うようにしました。

ps1

1Using NameSpace System.Windows.Forms 2 3Class MyForm : Form 4{ 5 [TextBox] $TxtBox1 = [TextBox]::new() 6 [TextBox] $TxtBox2 = [TextBox]::new() 7 [SplitContainer] $SplitContainer = [SplitContainer]::new() 8 9 MyForm() 10 { 11 $AnchorLeftTopRight = [AnchorStyles]::Left + [AnchorStyles]::Top + [AnchorStyles]::Right 12 13 $This.Controls.Add($This.SplitContainer) 14 $This.SplitContainer.Width = $This.ClientSize.Width 15 $This.SplitContainer.Anchor = $AnchorLeftTopRight 16 17 function AddTextBox 18 { 19 Param([Panel]$Panel, [TextBox]$TextBox, [ScriptBlock]$Script) 20 $Panel.Controls.Add($TextBox) 21 $TextBox.Width = $Panel.ClientSize.Width 22 $TextBox.Anchor = $AnchorLeftTopRight 23 $TextBox.Add_TextChanged($Script) 24 } 25 26 AddTextBox $This.SplitContainer.Panel1 $This.TxtBox1 { 27 $This.FindForm().TxtBox2.Text = $This.Text 28 } 29 30 AddTextBox $This.SplitContainer.Panel2 $This.TxtBox2 { 31 $This.FindForm().TxtBox1.Text = $This.Text 32 } 33 } 34} 35 36$Form = [MyForm]::new() 37 38$Form.ShowDialog()

投稿2019/02/01 00:38

編集2019/02/01 05:44
Zuishin

総合スコア28660

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

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

kamikazelight

2019/02/01 01:34

一先ずFormは無事取得出来たのでControlsから探せば操作は出来るようになったのですが >>Form 型なので、それを MyForm にキャスト がよくわかりません。 Formから所属しているクラスが取得できるのでしょうか? 教えて頂きたいです。 お願い致します。
Zuishin

2019/02/01 01:37

[MyForm]$MyForm = $Form でキャストできますが、もしかするとキャストしなくても使えるかもしれません。ある程度大きなものは C# で作るので Class はまだ使ったことがないのです。
kamikazelight

2019/02/01 01:44

できないです... -as とかも試したのですがだめです [MyForm]クラスの中の複数あるインスタンスプロパティーのうちの一つがForm型 ってだけなのですが Form型から その[MyForm]クラスへのキャストは本当にできるのでしょうか?
kamikazelight

2019/02/01 02:03

わかりました。 教えて頂いた内容から コントロールから上位オブジェクトが取得できることが分かったので 改めて確認してみたらparentも使えることが分かったので 状況に応じてControl.FindForm Methodと合わせて使っていきたいと思います。 ありがとうございました。
Zuishin

2019/02/01 02:09

Parent ではなく FindForm() をお伝えしたのは、Parent は Panel になると思ったからです。階層が浅ければ Parent でいいですね。
kamikazelight

2019/02/01 02:24

ありがとうございます。 Parentはすこし時間をかければ自分で見つけられたかもしれないですが、 Control.FindForm Method は見つけられなかったと思います。 選べる選択肢が増えたのでとてもありがたいです。 >>MyForm は Form から派生したものだと思い込んでいました。 の Form から派生させてMyForm を作るという発想が無かったのでとても興味深いです。 もしもForm から派生させてMyForm を作成した場合 今の内容と同じフォームを表示されることが出来て、尚且つ [MyForm]$MyForm = $This.FindForm() $MyForm.TxBox1 = "値" のようなことが出来るのでしょうか 可能ならば新しい質問を投稿致しますので 是非教えて頂きたいです。
Zuishin

2019/02/01 04:04

$MyForm.TxtBox1.Text = "値" のようにできます。というか C# で作るときには Form をそのまま使うことはほぼなくて、ほとんど Form の派生クラスを操作します。
Zuishin

2019/02/01 04:07

別に質問を立てなくても、この回答に追記しますので少し待ってください。
kamikazelight

2019/02/01 04:15

分かりました。お世話になります。
Zuishin

2019/02/01 05:09

追記しましたが、キャストしなくても使えるようでした。
kamikazelight

2019/02/01 06:23

ありがとうございます。やってみます
kamikazelight

2019/02/01 07:11 編集

継承ってこんなにいいものだったんですね ここ最近気になっていた問題が解決できそうです。 ありがとうございました。 あと.Anchorも助かりましたいままで[DockStyle]?かなにかを使ったことはあったのですが隙間を開けたいとき出来なかったのでイベントで書いていました。 またよろしくお願いいたします。
guest

0

連動させるコントロールがひとつなら、Tagプロパティに対象のコントロールを入れておくのではだめなんでしょうか。

該当部分のみ記述。

PowerShell

1 $Change = { 2 $This.Tag.Text = $This.Text 3 } 4 5 MyForm() { 6 $This.TxBox1.Tag = $This.TxBox2 7 }

コントロールを探す方法を知りたいって意図もあるのだろうと思いつつ。

投稿2019/02/01 02:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kamikazelight

2019/02/02 00:49

すみません 返事が投稿したつもりで出来ていませんでした。 遅くなりましたが回答ありがとうございました。 Tagもいろいろ試してみたのですが コンストラクターで $this.TxBox1.Tag = $this っとしておけばコントロールが複数あっても クラスのプロパティーで定義していれば Write-host $This.Tag.TxBox2.Text という感じで気軽にアクセスできました。 tag を使う方法も捨てがたいですね... ありがとうございました。
kamikazelight

2019/02/02 01:01

プロパティーはもちろん メソッドにもアクセスできますね... コントロールの量に応じて使わせていただきます。 次も宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問