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

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

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

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

35179閲覧

ShowDialogメソッドと値の受け渡し

TAKAYASU

総合スコア146

C#

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2015/12/18 11:03

WPFフォームを用いてウィンドウ間の値の受け渡しを試みてます。
親ウィンドウから子ウィンドウを出し、子ウィンドウで親ウィンドウのアクセサに値を代入し、使いまわししようと考えてますが、ShowDialogメソッドを用いて実行すると親ウィンドウに制御が戻る際に代入した値がNullになってしまいます。

上記の場合の対策等ありましたら教えていただけると嬉しいです。
また、子ウィンドウから親ウィンドウに作成したメソッドを呼び出し、メソッド内部にあるテキストボックスに文字列を代入しようとしたら反映されませんでした。

子ウィンドウから親ウィンドウのメソッドの呼び出しでは出来ないのでしょうか・・・?

以下コードになります。

//親ウィンドウ

class test
{

string settext;
public string setText
{
set{ this.settext = value;}
get{ return this.settext;}
}

public test()
{
InitializeComponent();
}
private void Button_Click(object sender,RoutedEventArgs e)
{
//子ウィンドウのオブジェクト
nextwindow next = new nextwindow();
//nextwindowの変数に値を代入する。
next.strAddress = "hoge";
//子ウィンドウを出す。
next.ShowDialog();
}

public void strText()
{
//Xamlに設定されたテキストボックス
GotText.Text = setText;
}
}

//子ウィンドウ

class nextwindow
{
string straddress;
public string strAddress
{
set{ this.straddress = value;}
get{ return this.straddress;}
}

//オブジェクト作成
test t = new test();
public nextwindow()
{
InitializeComponent();
}

private void Button_Click(object sender , RoutedEventArgs e)
{
//testクラスのsetTextにstrAddressを代入
t.setText = strAddress;
//testクラスのstrTextメソッド呼び出し
t.strText();
//子ウィンドウを閉じる
this.Close();
}
}

すでに調べ・悩み始めて3時間経過しようとしてるので出来るだけ優しく教えていただけると幸いですm(_ _)m

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご質問にある

親ウィンドウから子ウィンドウを出し、子ウィンドウで親ウィンドウのアクセサに値を代入し、使いまわししようと考えてますが、ShowDialogメソッドを用いて実行すると親ウィンドウに制御が戻る際に代入した値がNullになってしまいます。

を踏まえてコードを見ると

C#

1 //オブジェクト作成 2 test t = new test(); 3() 4 private void Button_Click(object sender , RoutedEventArgs e) 5 { 6 //testクラスのsetTextにstrAddressを代入 7 t.setText = strAddress; 8 //testクラスのstrTextメソッド呼び出し 9 t.strText(); 10 //子ウィンドウを閉じる 11 this.Close(); 12 }

と子ウィンドウクラス内で親ウィンドウクラスtestをnewで作っているのが不具合の原因です。

子ウィンドウを呼び出す段階で親ウィンドウはすでに存在しているので、newで新しく作ったものは親ウィンドウとそっくりですが別の存在です。

子ウィンドウで親ウィンドウのメソッドを操作したいのであれば

C#

1test t; 2public void setParent(test parent) 3{ 4 t = parent; 5}

のようなメソッドをnextwindowクラスに持たせて、子ウィンドウを呼び出す際に

C#

1nextwindow next = new nextwindow(); 2next.strAddress = "hoge"; 3// 親ウィンドウをセット 4next.setParent(this); 5next.ShowDialog();

のように親ウィンドウ自身をセットしてやればいいです(今手近に確認できる環境がないので、何か見落としがあって動かなかったら済みません)。

投稿2015/12/18 11:34

KoichiSugiyama

総合スコア3041

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

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

TAKAYASU

2015/12/19 03:48

回答ありがとうございます! 原因の理由とその解決を詳細に記載して頂いたのでベストアンサーにしました! 別のとこから参照する場合は「これは親ウィンドウです」っていうのを明確にしなければならないのですね、ありがとうございました!
guest

0

子から親の何かを呼び出すには、親のインスタンスを子に持たせてあげて、それをもとに呼び出してあげればいいです

nextwindow側にtest型のmyparentでも持たせて、testのButton_Clickでnextwindowのmyparentに自分(this)を入れておけば、

t.setText = strAddress;

の代わりに

myparent.setText = strAddress;

などとできると思います

投稿2015/12/18 11:17

編集2015/12/18 11:58
dojikko

総合スコア3939

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

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

TAKAYASU

2015/12/19 03:50

シンプルでわかりやすい回答・編集ありがとうございます! 今回はより明確な理由を記載していただいたKoichiさんをベストアンサーとしました! まとめるとthisが重要ということなんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問