- モンジ
- ベテラン
- 会議室デビュー日: 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 を使わなくても子フォームのプロパティーでよいですね。
|