DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーム間のデータの受け渡しについて

環境/言語:[Visual Studio2008/C#]
分類:[.NET]

とても初歩的な質問なんですが。
フォーム4からフォーム5に移動して、
フォーム5で入力された値をフォーム4で表示する方法なのですが。

まず、フォーム4では、
public partial class Form4 : Form
{
public DataSet DSet ;

public Form4()
{
InitializeComponent();
}

private void Form4_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
Form5 form5 = new Form5();
form5.ShowDialog();

tableLayoutPanel1.Controls.Clear();
Label lb = new Label();
lb.Text = DSet.ChA;
tableLayoutPanel1.Controls.Add(lb);
tableLayoutPanel1.BackColor = Color.Pink;

}
}
次に、フォーム5では、
public partial class Form5 : Form
{
private DataSet DSet ;
public Form5()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
DSet = new DataSet();

DSet.ChA = checkBox1.Text;

Form4 form4 = new Form4();

form4.DSet = this.DSet;

}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}

}
と、なっています。
これとは別にデータを格納するデータクラスがあり、
プロパティが設定してあります。
ShowDialogは閉じると値はNULLになってしまうのでしょうか?
かなり行き詰っています。
どうか教えてください。。。。
■No22844に返信(mai_pagさんの記事)
フォーム5で new Form4(); してるってことは、フォーム5を呼び出した
フォーム4とは別のフォーム4をメモリ上に作成しているはずだけど、
それはおっけー?
フォーム5で form4.Show(); ってやると2画面表示されない?
■No22845に返信(るしぇさんの記事)
> ■No22844に返信(mai_pagさんの記事)
> フォーム5で new Form4(); してるってことは、フォーム5を呼び出した
> フォーム4とは別のフォーム4をメモリ上に作成しているはずだけど、
> それはおっけー?
> フォーム5で form4.Show(); ってやると2画面表示されない?

そうですね、確かに新しくnewしてるから別のフォームでした。
でも、別のフォーム4ではなくて元のフォームに値を入れたい場合はどうすればいいですか?
mai_pagさん
> でも、別のフォーム4ではなくて元のフォームに値を入れたい場合はどうすればいいですか?

Form4にて、
Form5 form5 = new Form5();
form5.ShowDialog();
のあとに、
this.DSet=form5.DSet;

で取得できませんか?
■No22868に返信(きいよさんの記事)

> Form4にて、
> Form5 form5 = new Form5();
> form5.ShowDialog();
> のあとに、
> this.DSet=form5.DSet;
>
> で取得できませんか?
>
出来ました!!
ところでこの場合Form5の方のDSetはpublicにする必要がありますよね?
セキュリティーとかの面では問題ないのでしょうか?
このやり方は一般的なやり方でしょうか?
何度も質問してすみません。。。
> ところでこの場合Form5の方のDSetはpublicにする必要がありますよね?
> セキュリティーとかの面では問題ないのでしょうか?
public にするのではなく、
property等で参照できるようにしてはどうでしょう。
■No22873に返信(きいよさんの記事)
>>ところでこの場合Form5の方のDSetはpublicにする必要がありますよね?
>>セキュリティーとかの面では問題ないのでしょうか?
> public にするのではなく、
> property等で参照できるようにしてはどうでしょう。

すみません。C#は初心者なので、
具体的にどうすればいいのか教えていただけませんか?
■No22874に返信(mai_pagさんの記事)
> ■No22873に返信(きいよさんの記事)
> >>ところでこの場合Form5の方のDSetはpublicにする必要がありますよね?
> >>セキュリティーとかの面では問題ないのでしょうか?
>>public にするのではなく、
>>property等で参照できるようにしてはどうでしょう。
>
> すみません。C#は初心者なので、
> 具体的にどうすればいいのか教えていただけませんか?

たぶんこういうことかなと思います。

//DsetをdSetに変えてます。
//これ自体に深い意味はないですが、プロパティとして公開するほうをDsetにした//かったので、メンバー変数側をdSetにしました。
private DataSet dSet;

//メンバー変数dSetに対するプロパティを作成します。
//外部クラスからForm5.DsetプロパティにDataSetをセットすることはなさそうです//から、getだけにしました。
public DataSet Dset
{
get
{
return this.Dset;
}
}
■No22877に返信(紅の豚118さんの記事)

どうも別のFormで生成したDataSetを、呼び出し元のFormで使いたいみたいですね。
プロパティを使わなくても、こんな感じでもいけるかと思います。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();

//Form2クラスのオリジナルイベントにメソッドを登録
form.Event += new Form2.OriginalEvent(form_Event);

form.ShowDialog();
}

void form_Event(DataSet dset)
{
//このメソッドが呼び出されるとき、引数のDataSetには
//Form2で作成したDataSetが入ってきます。
}
}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

//オリジナルイベント
public event OriginalEvent Event;

//オリジナルイベントのためので#region ゲート
public delegate void OriginalEvent(DataSet dset);

private void button1_Click(object sender, EventArgs e)
{
DataSet dset = new DataSet();

this.Event(dset);
}
}

先にForm2クラスのほうからコーディングしてくださいね。
■No22878に返信(紅の豚118さんの記事)
> ■No22877に返信(紅の豚118さんの記事)
>
> どうも別のFormで生成したDataSetを、呼び出し元のFormで使いたいみたいですね。
> プロパティを使わなくても、こんな感じでもいけるかと思います。

返信遅くなってすみません。
いわれたとおりにやってみたのですが、

”エラー 1 アクセシビリティに一貫性がありません。パラメータの型 'WindowsFormsApplication1.DataSet' のアクセシビリティはデリゲート 'WindowsFormsApplication1.form2.OriginalEvent' よりも低く設定されています。 ”

と、エラーが出てしまうのですが...
どうしたらいいですか??
■No22885に返信(mai_pagさんの記事)
> ■No22878に返信(紅の豚118さんの記事)
>>■No22877に返信(紅の豚118さんの記事)
>>
>>どうも別のFormで生成したDataSetを、呼び出し元のFormで使いたいみたいですね。
>>プロパティを使わなくても、こんな感じでもいけるかと思います。
>
> 返信遅くなってすみません。
> いわれたとおりにやってみたのですが、
>
> ”エラー 1 アクセシビリティに一貫性がありません。パラメータの型 'WindowsFormsApplication1.DataSet' のアクセシビリティはデリゲート 'WindowsFormsApplication1.form2.OriginalEvent' よりも低く設定されています。 ”
>
> と、エラーが出てしまうのですが...
> どうしたらいいですか??
>

アクセシビリティ〜と言われたときには、privateやpublicなどのアクセス修飾子で何らかの矛盾が発生していることを意味します。よってアクセス修飾子のあたりを確認してみてください。

例えばこれはクラスの場合ですが、同じようにアクセス修飾子からきているエラーです。
http://blog.livedoor.jp/sire2/archives/50119792.html

DOBON.NET | プログラミング道 | プログラミング掲示板