C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: Form間の値渡しについて


(過去ログ 77 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■45393 / inTopicNo.1)  Form間の値渡しについて
  
□投稿者/ とんこつ (1回)-(2010/01/11(Mon) 23:30:51)

分類:[C#] 

こんばんは、とんこつといいます。
環境はC#2008pro Windows Xpを使っています。

質問はタイトルの「Form間の値渡しについて」です。

メインForm(ID,passを入力するフォーム)で、ID,passが合えば
サブFormを呼び出すプログラムなのですが、
サブFormにて受け取る値が、メインFormの初期値の値となってしまい、ID,passが合ったときの
値を拾うことができません。

とても初歩的な質問だとは思いますが、アドバイスをいただけないでしょうか。

引用返信 編集キー/
■45394 / inTopicNo.2)  Re[1]: Form間の値渡しについて
□投稿者/ επιστημη (2374回)-(2010/01/11(Mon) 23:37:25)
επιστημη さんの Web サイト
コードみせて。
引用返信 編集キー/
■45395 / inTopicNo.3)  Re[2]: Form間の値渡しについて
□投稿者/ とんこつ (2回)-(2010/01/11(Mon) 23:49:30)
No45394 (επιστημη さん) に返信
> コードみせて。

επιστημη さん返信ありがとうございます。
コードは
**********main Form*****************
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}

public string ID;
string pass;

public void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length != 0 && textBox2.Text.Length != 0)
{
ID =textBox1.Text;
pass =textBox2.Text;

StreamReader sr = new StreamReader("**");

string dat;
int check = 0;

while ((dat = sr.ReadLine()) != null)
{
string[] sbuf = dat.Split(',');
if (ID == sbuf[0] && pass == sbuf[1])
{
check = 1;
MessageBox.Show("ログイン成功!!");

Form5 newForm = new Form5();
newForm.ShowDialog();
//this.Close();

}

}
sr.Close();
if (check != 1)
{
MessageBox.Show("ログイン失敗!!");
}
}
else
{
MessageBox.Show("IDまたは、passが入力されていません。");
}
}
***********************sub Form**********************************

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

//private Form4 otherForm;
Form4 otherForm = new Form4();

string id;

private void Form6_Load(object sender, EventArgs e)
{
id = otherForm.ID;
label2.Text="あなたは"+id+"でログインしています。";
}
}
*****************************************************************
となっています。
引用返信 編集キー/
■45396 / inTopicNo.4)  Re[3]: Form間の値渡しについて
□投稿者/ ベリ工 (1回)-(2010/01/12(Tue) 01:22:29)
ぱっと見、指摘箇所てんこもりですが、まずは『Form間の値渡しについて』ですが、
sub FormのForm6で参照しているForm4のIDは、main FormのForm4のインスタンスとは
全く関係無いのでIDは空っぽでしょう。また、ぱっと見て気がついた点を以下に列挙しておきます。

1:ソースが見にくい(インデントを入れて投稿してほしい=図表モード)
2:ログイン成功の時にコールしているのはForm5となっており、sub Formのフォームは
  Form6である。Form6はどこからコールされるの?
3:main FormのForm4のbutton1_Clickイベント関数内にて画面に入力されたIDとパスワード
  をどこかのファイルに記載してあるIDとパスワードをEOFになるまでチェックしているが、
  そのファイルに同じIDとパスワードが複数あったら複数回sub Formが起動される作りに
  なっているのはOKですか?
4:Splitでカンマ区切りしているようですが、カンマの無いデータが紛れ込んでいた時は
  例外が発生しそうな作りになっている。
5:ログイン成功の時はファイルをオープンしっぱなしで別フォームを開く作りになって
  いるのはOKですか?
引用返信 編集キー/
■45397 / inTopicNo.5)  Re[4]: Form間の値渡しについて
□投稿者/ とんこつ (3回)-(2010/01/12(Tue) 02:36:37)
ベリ工 さん、返信ありがとうございます。
Form6で参照しているとおもっていたForm4のIDは全く関係なかったのですね…。
ちゃんと参照しているのかどうか試しに、Form4のID宣言のところを

public string ID="test";

としたところ、Form6で"test"と表示されたので、初期値をとっているものとばかり思っていました。

私が先にあげたようなことをする場合、どのようにしたらよいのでしょうか?

ベリ工 さんのご指摘の件です。
1:お恥ずかしい限りです。次回からは見やすく掲載したいと思います。
2:こちらの説明不足ですみません。Form4にてログイン後、モードを選択するForm5に移りまして、
 モード選択後にForm6が呼び出される仕様となっています。必要ないかと思いこちらの独断で掲載しませんでした。
 申し訳ありません。
3:そこは了承しています。ただの言い訳となってしまいますが、
 現時点ではそこはまだほとんど手をつけておらず、
 参照ファイルは同IDとパスワードが存在しない前提で作っています。
 これについては4のご指摘も同様で、現時点で、カンマの無いデータが紛れ込んでいた時を考えない前提でつくっております。
5: //this.Close()
 のコメントアウトについてのご指摘でしょうか?間違っていたらすみません。
 //this.Close()は、私がFormを一度閉じてしまうから、初期値しか読み込めないのだろうかと考えてしまったためです。

No45396 (ベリ工 さん) に返信
> ぱっと見、指摘箇所てんこもりですが、まずは『Form間の値渡しについて』ですが、
> sub FormのForm6で参照しているForm4のIDは、main FormのForm4のインスタンスとは
> 全く関係無いのでIDは空っぽでしょう。また、ぱっと見て気がついた点を以下に列挙しておきます。
>
> 1:ソースが見にくい(インデントを入れて投稿してほしい=図表モード)
> 2:ログイン成功の時にコールしているのはForm5となっており、sub Formのフォームは
>   Form6である。Form6はどこからコールされるの?
> 3:main FormのForm4のbutton1_Clickイベント関数内にて画面に入力されたIDとパスワード
>   をどこかのファイルに記載してあるIDとパスワードをEOFになるまでチェックしているが、
>   そのファイルに同じIDとパスワードが複数あったら複数回sub Formが起動される作りに
>   なっているのはOKですか?
> 4:Splitでカンマ区切りしているようですが、カンマの無いデータが紛れ込んでいた時は
>   例外が発生しそうな作りになっている。
> 5:ログイン成功の時はファイルをオープンしっぱなしで別フォームを開く作りになって
>   いるのはOKですか?


引用返信 編集キー/
■45398 / inTopicNo.6)  Re[5]: Form間の値渡しについて
□投稿者/ なかむら (2回)-(2010/01/12(Tue) 07:37:17)
なかむら さんの Web サイト
サブフォームに、必要なデータを受け取るためのプロパティを用意し、
メインフォームがサブフォームを生成して表示する間に、
ログイン成功時のデータをサブフォームに設定してやるのが簡単だと思います。
引用返信 編集キー/
■45429 / inTopicNo.7)  Re[6]: Form間の値渡しについて
□投稿者/ ベリ工 (2回)-(2010/01/12(Tue) 21:06:47)
>2:こちらの説明不足ですみません。Form4にてログイン後、モードを選択するForm5に移りまして、
> モード選択後にForm6が呼び出される仕様となっています。必要ないかと思いこちらの独断で掲載しませんでした。
> 申し訳ありません。

そうでしたか。読み手からはそのような仕様である事はわからないので必要最低限の範囲内で
すべてのコードを載せないと回答者には伝わりません。

>5: //this.Close()
> のコメントアウトについてのご指摘でしょうか?間違っていたらすみません。
> //this.Close()は、私がFormを一度閉じてしまうから、初期値しか読み込めないのだろうかと考えてしまったためです。

そうではないです。
StreamReader sr = new StreamReader("**");
でファイルをオープンし、sr.Close()がコールされる前に
ログイン成功の時にsub Formを『ShowDialog()』していますよね?
という事が言いたかっただけです。もしオープンしっぱなしで
ファイルのIDやパスワードの登録・更新・削除が行われたら
例外が発生しますよと言いたかったわけです。

本題から外れましたが、『Form間の値渡しについて』の回答はなかむらさんが言っている事を
行えば良いです。他にも方法はありますがこれが一番簡単でしょうね。

引用返信 編集キー/
■45617 / inTopicNo.8)  Re[7]: Form間の値渡しについて
□投稿者/ とんこつ (4回)-(2010/01/15(Fri) 22:31:30)
なかむらさん、ベリ工さん返信ありがとうございます。

なかむらさんのアドバイス通りに

public class IDname
{
public static string ID { get; set; }
}

と、Program上でstatic宣言することでForm6だけでなく、他のFormからも値を読みだすことができました。
ありがとうございます。

また、ベリ工さん例外処置も解決していきたいと思います。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -