- PR -

子フォームから親フォームの内容の戻り値を受けたい。

1
投稿者投稿内容
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2008-08-21 14:37
VS2005、VB.NET、WinFormの開発を行っています。


1つのフォーム(親フォーム)内に、
1つのユーザコントロール(子フォーム)があります。

親フォームにはチェックボックスコントロールがあり、
子フォームにはボタンコントロールがあります。

子フォームのボタンを押すと、親フォームのチェックボックスを
操作させるには、イベントを使って実現させています。

しかし、イベントでは戻り値が得られないため、
子フォームから親フォームのチェックボックスの状態を
得ることが出来ません。

デリゲードを使う方法も考えましたが、
親フォームのインスタンスを行う必要があり、
チェックボックスの状態を得ることは出来ませんでした。

子フォームから親フォームのチェックボックスの状態を
得る方法を知っている方、教えてください。

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-08-21 16:03
子供が親のことを知ろうとすると、コントロールの再利用性を大きく下げることになります。
子供のにプロパティを用意して、親のチェックボックスが変わった時に、子供のプロパティの値を変更してあげてはどうでしょう。
_________________
かるあ のメモスニペット
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-08-21 16:23
引用:

モンジさんの書き込み (2008-08-21 14:37) より:
子フォームのボタンを押すと、親フォームのチェックボックスを
操作させるには、イベントを使って実現させています。

しかし、イベントでは戻り値が得られないため、
子フォームから親フォームのチェックボックスの状態を
得ることが出来ません。


フォームの親子関係はあるのかもしれませんが、チェックボックスの値のやりとりでは別段親子関係はなく、対等な立場として扱うほうが自然だろうと思います。
子フォームから親フォームにイベントで通知したのならば、戻り値に相当する情報を、親フォームから子フォームにイベントで通知するのが対等さという点では良いと思います。ただ、一気に複雑になるとは思います。

現状をできるだけ変えないようにするとしたら、子フォームから親フォームにイベントで通知する際に、EventArgs を渡していると思いますので、親フォームの側でその引数の内容を書き換えてやれば良いかもしれません。
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2008-08-22 07:52
●かるあさん こんちには。

引用:
子供が親のことを知ろうとすると、コントロールの再利用性を大きく下げることになります。
子供のにプロパティを用意して、親のチェックボックスが変わった時に、子供のプロパティの値を変更してあげてはどうでしょう



そうですね。やはりプロパティを使うのがよいですかね。

●unibonさん こんにちは。

引用:
現状をできるだけ変えないようにするとしたら、子フォームから親フォームにイベントで通知する際に、EventArgs を渡していると思いますので、親フォームの側でその引数の内容を書き換えてやれば良いかもしれません。



少し質問させてください。

子フォームに、
Public Event SetChecked(ByVal e As System.EventArgs)
を宣言しておいて、ボタンを押した際に、
RaiseEvent SetChecked(e)で、親フォームのイベントを呼ぶとした場合、
親フォームでEventArgsの内容を書き換えても、どのように子フォームで
取得すればよろしいのですか。

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-08-22 09:52
引用:

モンジさんの書き込み (2008-08-22 07:52) より:

引用:
現状をできるだけ変えないようにするとしたら、子フォームから親フォームにイベントで通知する際に、EventArgs を渡していると思いますので、親フォームの側でその引数の内容を書き換えてやれば良いかもしれません。



少し質問させてください。

子フォームに、
Public Event SetChecked(ByVal e As System.EventArgs)
を宣言しておいて、ボタンを押した際に、
RaiseEvent SetChecked(e)で、親フォームのイベントを呼ぶとした場合、
親フォームでEventArgsの内容を書き換えても、どのように子フォームで
取得すればよろしいのですか。



VB.NET ではなく C# ですみませんが、つぎのような感じです。
引用:

using System;
using System.Windows.Forms;

namespace Hoge
{
public partial class Form1 : Form
{
public event CheckedEventHandler CheckedHandler;

public Form1()
{
InitializeComponent();

CheckedHandler += new CheckedEventHandler(Form1_checkedHandler);
}

private void Form1_checkedHandler(object sender, CheckedEventArgs e)
{
Console.WriteLine("before: " + e.foo);
e.foo = "bye";
}

private void button1_Click(object sender, EventArgs e)
{
if (CheckedHandler != null)
{
CheckedEventArgs cea = new CheckedEventArgs();
cea.foo = "hello";
CheckedHandler(this, cea);
Console.WriteLine("after: " + cea.foo);
}
}
}

public class CheckedEventArgs : EventArgs
{
public string foo;

public CheckedEventArgs()
{
}
}

public delegate void CheckedEventHandler(object sender, CheckedEventArgs e);
}


要はイベントハンドラーをコールしたあとに、渡した引数の内容が変わってないかを見るだけです。イベントが同期的に実行されることを期待しているので、あまりキレイではありませんが。

これは、
引用:

モンジさんの書き込み (2008-08-21 14:37) より:
しかし、イベントでは戻り値が得られないため、
子フォームから親フォームのチェックボックスの状態を
得ることが出来ません。

デリゲードを使う方法も考えましたが、
親フォームのインスタンスを行う必要があり、
チェックボックスの状態を得ることは出来ませんでした。


に対する回答になると思います。
(ただ、私はここで書かれている「親フォームのインスタンスを行う必要があり」の意味が良く分かりませんでした。)

ただ、これらのことをしなくても、かるあさんのように子フォームにプロパティーを持たせておけば、それを見るようにすれば良いと思います。

私は、親フォームと子フォームの間の双方向のイベントが難しければ、復路は EventArgs が使えますよ、と思ったのですが、よく考えたら別に EventArgs を使わなくても子フォームのプロパティーでよいですね。
1

スキルアップ/キャリアアップ(JOB@IT)