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

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

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

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

Windows

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

.NET Framework

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

Q&A

1回答

3253閲覧

C#での親要素の取り扱いについて

arw.tyx-out_mz

総合スコア27

C#

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

Windows

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

.NET Framework

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

0グッド

3クリップ

投稿2018/07/16 07:04

前提・実現したいこと

C#でフォームアプリケーションを作成しています。
ユーザーコントロールの中にパネルを配置し、その中にさらにユーザーコントロールを配置するということをしております。
親コントロール(パネル)->子コントロール
という制御です。

この時の子コントロールから親コントロールを参照する時に出た疑問について質問いたします。

疑問点

以下の2つの違いについて教えていただきたいです。
①子コントロールのコンストラクタで親コントロールをthisを受け取る
②this.Parentで取得した親要素を親コントロールでキャストする

①については、

C#

1public class ParentControl : UserControl 2{ 3 public static ChildControl child; 4 public ParentControl() 5 { 6 child = new ChildControl(this); // 親要素をthisで渡す 7 panel.Controls.Add(parent); 8 } 9} 10 11public class ChildControl : UserControl 12{ 13 public static ParentControl parent; 14 public ChildControl(ParentControl _parent) 15 { 16 parent = _parent; // 子要素で親要素を受け取る 17 } 18}

②については、

C#

1public class ParentControl : UserControl 2{ 3 public static ChildControl child; 4 public ParentControl() 5 { 6 child = new ChildControl(); 7 } 8} 9 10public class ChildControl : UserControl 11{ 12 public static ParentControl parent; 13 public ChildControl() 14 { 15 parent = (ParentControl)this.Parent; // 親要素を取得しParentControlでキャスト 16 } 17}

というソースになります。(簡略化してあります)

①の場合はエラーが発生せずにうまく処理でき、
②の場合はハンドルされてないエラーでアプリケーションが落ちます。

これら2つの違いはいったい何でしょうか?

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

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

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

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

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

guest

回答1

0

child = new ChildControl();

このときのchild.Parentを見てみてください。
nullになってるんじゃないでしょうか

投稿2018/07/16 07:13

y_waiwai

総合スコア87747

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

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

arw.tyx-out_mz

2018/07/16 07:33

ということは、コンストラクタの段階では親要素は設定されていないということですか? ユーザーコントロールのロード時に設定すべきなのでしょうか。
y_waiwai

2018/07/16 07:44

自前で生成した場合は明示的にParentを設定してやらなければなりません。 そして、それで生成したコントロールは表示されるようになります
pepperleaf

2018/07/16 07:54

単に new されたユーザーコントロールは親無し子。親子関係を設定する必要があるという事ですね。
arw.tyx-out_mz

2018/07/16 09:18

親コントロールにあるパネルに子コントロールをAddしているのですが、それでは親子関係は設定できていないのでしょうか?
len_souko

2018/07/16 12:07

addする前にChildControlのコンストラクタが走るから
y_waiwai

2018/07/16 14:54

public ParentControl() { child = new ChildControl(); } Addしてるとことがないのですが。
YAmaGNZ

2018/07/17 01:43

通常、コントロールを追加し、表示するには以下の流れになります。 ```C# public class ParentControl : UserControl { public static ChildControl child; public ParentControl() { child = new ChildControl(); //1 this.Controls.Add(child); //2 } } ``` childのParentプロパティは2の時に親子関係が生成され、設定されます。 childのコンストラクタは1の時に動きますから、Parentプロパティはnullとなります。 子から親へのアクセスを行うのであれば、最初に親のインスタンスを保持しておくのではなく、アクセスするその時にParentプロパティを参照すべきです。 もし、子のコンストラクタで親にアクセスする必要があるのであれば、①のようにコンストラクタの引数で渡す形になるかと思います。 また、ソースを見て思ったのですが、親インスタンス(もしくは子インスタンス)を保持する変数はstaticでいいんですか? 親コントロール(もしくは子コントロール)が複数合った場合えらいことになりそうですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問