• 締切済み

C# Form間のデータの受け渡し

Form2のテキストボックスとコンボボックス内のテキストをForm1のdataGridViewに転記したいと思っているのですがうまくいかず悩んでいます. //datagridveiwに添付 DataGridView f1_Text = (DataGridView)f1.Controls["dataGridView1"]; f1_Text.Rows.Add(Text1, Text2, "→", Text3, Text4); 上記のようなプログラムを組んで走らせると下記のようなエラーとなってしまいます. NullReferenceException オブジェクト参照がオブジェクト インスタンスに設定されていません。 Text1~Text2はそれぞれテキストボックスとコンボボックスのテキストになります. どなたか,どうすればよいかご教授頂けませんでしょうか?

みんなの回答

noname#160041
noname#160041
回答No.15

>>私は技術的理由で「お勧めしない」といってるわけじゃないので技術的理由で「お勧めしない」といってる方にお尋ねください。 了解しました。そのようにします。 質問への回答を書いておきます。 TabControlからDataGridViewが取得出来ないのは、コントロールの階層を誤っているからでしょう。 TabControlからカレントのTabPageを取得して、TabPageからDataGridViewを取得します。 手順としては、 TabControl tb = (TabControl)this.f1.Controls["tabControl1"]; TabPage page = (TabPage)tb.TabPages[tb.SelectedIndex]; DataGridView grid = (DataGridView)page.Controls["dataGridView1"]; grid.Rows.Add("test"); となります。 質問と似たような状態を作成してVisual C# 2010で試していますが、取得に失敗した時のことは考慮していないので、適切に対策を講じて下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1623/5662)
回答No.14

>質問者も#1もControlsプロパティを使用して操作していたのに、「何故お勧めできないのか」の技術的な理由を訊いたら、 私は技術的理由で「お勧めしない」といってるわけじゃないので技術的理由で「お勧めしない」といってる方にお尋ねください。

全文を見る
すると、全ての回答が全文表示されます。
noname#160041
noname#160041
回答No.13

#12を投稿した時に更新されていたので、追記しておくと、 >>「技術的理由ではなくて設計思想上の理由」と答えてるのにそれを無視して技術的理由とし解釈しようとしてたわけですか。それは話が通じるわけないですね。 >>私は「技術的に問題があるからお勧めしない」といってるわけじゃないですから。 ウチは技術的理由を求めたんだけどねえ。 >>そもそもContorolsがpublicなプロパティ(この場合は変数でも変わらないでしょうが)という事を知らないのであれば「他フォームのControlを直接操作するのはお勧めしない」ということもいえないと思いますが? 「ということもいえないと思いますが」とかそういう話じゃなくて、貴殿の事ですよ。知らなかったんでしょ。 >>フォームにメソッドなりプロパティを用意すると書いてるのもControlを取得するためのメソッドやプロパティを用意しましょうと書いてるんじゃなく、値を取得したり設定するためのメソッドやプロパティを用意するということなんですけど。 >>それにControlsプロパティを使って他フォームから直接操作した場合、そのフォームの画面構成が変わった場合にその操作を行ってるフォーム全てを書き直すことになりかねませんが(これも#6に書いてます) ウチは技術的理由を求めたんだけどねえ。

全文を見る
すると、全ての回答が全文表示されます。
noname#160041
noname#160041
回答No.12

>>「Controlsがプロパティであることをお前は知らなかったんだろう」と決めつけのコメントされても・・・ 質問者も#1もControlsプロパティを使用して操作していたのに、「何故お勧めできないのか」の技術的な理由を訊いたら、 >>仮にフォームAとしますけどフォームAのコントロールを他のフォームBが直接操作するためにはpublic(internalとかもありますが)にする必要があります。 >>これをクラスで考えた場合、クラスAのメンバ変数を他のクラスから操作させるがためにpublicにするというのと同じだと思います。 >>通常はクラスAにアクセスするためのメソッドを用意するなりクラスAのプロパティとして定義したりすると思いますが、いかがでしょうか? なんて文言が返って来た。「Controlsはパブリックなプロパティ」なのに。これは如何に? >>タイマースレッドだしたのは1例としてあげただけのはずですが。 >>フォームが増えた場合の話も出してるのに、勝手に人の話をそれだけの限定したものにしないでください。 申し訳ないけど、ウチはこういうやり取りが一番嫌いでねえ。話をまとめると、 ・シングルスレッドの場合は、Controlsプロパティで操作しても技術的な問題はない。 ・マルチスレッドの場合は、別スレッドからControlsプロパティで操作するのは技術的な問題があると。 上記2項目のいづれもFormの数に関わらずですよ。 ただ、それ以外に技術的な問題があると言うのなら、MSDNを交えて簡単にご説明頂ければと。 >>人の話をねじ曲げて解釈してコメントされても困ります。 捻じ曲げたつもりは無いんだけど、もうちょっと技術的な返答をしてほしいと言うのが本音ですなあ。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1623/5662)
回答No.11

>>>デリゲートを使った例は書きましたけど私の主張してるのは「他のフォームのコントロールを直接操作するのはお勧めしない」ですし。 > >いや、質問は別Form上のDataGridViewの操作の仕方でしょ。だから質問者も#1もControlsプロパティを使用して操作しているのでしょ。 >で、ウチが「何故お勧めできないのか」の技術的な理由を訊いたら、 > >>>通常はクラスAにアクセスするためのメソッドを用意するなりクラスAのプロパティとして定義したりすると思いますが、いかがでしょうか? > >なんて意味不明な妄言が出て来たと。要はControlsがプロパティである事を知らなかったんでしょ。 >そんな御仁の主張など無意味だわな。 「技術的理由ではなくて設計思想上の理由」と答えてるのにそれを無視して技術的理由とし解釈しようとしてたわけですか。それは話が通じるわけないですね。 私は「技術的に問題があるからお勧めしない」といってるわけじゃないですから。 そもそもContorolsがpublicなプロパティ(この場合は変数でも変わらないでしょうが)という事を知らないのであれば「他フォームのControlを直接操作するのはお勧めしない」ということもいえないと思いますが? フォームにメソッドなりプロパティを用意すると書いてるのもControlを取得するためのメソッドやプロパティを用意しましょうと書いてるんじゃなく、値を取得したり設定するためのメソッドやプロパティを用意するということなんですけど。 それにControlsプロパティを使って他フォームから直接操作した場合、そのフォームの画面構成が変わった場合にその操作を行ってるフォーム全てを書き直すことになりかねませんが(これも#6に書いてます)

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1623/5662)
回答No.10

>いや、Controlsがプロパティである事自体、ウチがMSDNを突き付けて初めて知ったんでしょ。 (以下略) 「Controlsがプロパティであることをお前は知らなかったんだろう」と決めつけのコメントされても・・・ >タイマースレッドも別スレッドで非同期動作するマルチスレッドの一つなんだけど。 タイマースレッドだしたのは1例としてあげただけのはずですが。 フォームが増えた場合の話も出してるのに、勝手に人の話をそれだけの限定したものにしないでください。 >NetFrameworkは広大なものだから全部理解する事は不可能だけど、何かを主張するなら、ある程度はMSDNなり書籍なりで調べてもらわないとねえ。 人の話をねじ曲げて解釈してコメントされても困ります。

全文を見る
すると、全ての回答が全文表示されます。
noname#160041
noname#160041
回答No.9

>>そうですね。 >>Contorolsはpublicなプロパティですね。 >>でも私はControlsプロパティがpublicなのはVisualStudioのデザイン画面(のプログラム)のためだと思ってますから。 >>だからといってControlsプロパティを使うなとはいうつもりはありません。 >>使う必要があるなら使えばいい。 いや、Controlsがプロパティである事自体、ウチがMSDNを突き付けて初めて知ったんでしょ。 >>誰がマルチスレッドだけを前提にした話をしてたんでしょう? タイマースレッドも別スレッドで非同期動作するマルチスレッドの一つなんだけど。 >>デリゲートを使った例は書きましたけど私の主張してるのは「他のフォームのコントロールを直接操作するのはお勧めしない」ですし。 いや、質問は別Form上のDataGridViewの操作の仕方でしょ。だから質問者も#1もControlsプロパティを使用して操作しているのでしょ。 で、ウチが「何故お勧めできないのか」の技術的な理由を訊いたら、 >>通常はクラスAにアクセスするためのメソッドを用意するなりクラスAのプロパティとして定義したりすると思いますが、いかがでしょうか? なんて意味不明な妄言が出て来たと。要はControlsがプロパティである事を知らなかったんでしょ。 そんな御仁の主張など無意味だわな。 >>誰にとって当たり前の話なんでしょう? >>少なくとも今の私にとっては当たり前じゃないんですが、.NET使い始めのころはやってた気はしますけど。 さあ「.NET使い始めのころはやってた気はしますけど」なのに、何でControlsがプロパティである事を知らないんだろう。 NetFrameworkは広大なものだから全部理解する事は不可能だけど、何かを主張するなら、ある程度はMSDNなり書籍なりで調べてもらわないとねえ。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1623/5662)
回答No.8

>いかがでしょうも何も、ControlsってのはWindowsFormsで定義されているパブリックのプロパティだぞ。 >要は自作した全てのFormにはControlsというパブリックのプロパティが存在する。 そうですね。 Contorolsはpublicなプロパティですね。 でも私はControlsプロパティがpublicなのはVisualStudioのデザイン画面(のプログラム)のためだと思ってますから。 だからといってControlsプロパティを使うなとはいうつもりはありません。 使う必要があるなら使えばいい。 でもフォームが他のフォームのコントロールを直接操作しないと実現できないことってそんなにあるんですか。 >スレッドセーフにするのならデリゲートを使用しないとまずいんだが、そもそもマルチスレッドのGUIアプリなんて、マルチスレッド前提のソースが必要になるから、将来的にマルチスレッドになるかもしれないなんて言う想定レベルのソースじゃ話にならない。 >シングルスレッドのGUIアプリなら、インスタンス外からFormのControlsプロパティを操作するのは当たり前の話。 誰がマルチスレッドだけを前提にした話をしてたんでしょう? デリゲートを使った例は書きましたけど私の主張してるのは「他のフォームのコントロールを直接操作するのはお勧めしない」ですし。 誰にとって当たり前の話なんでしょう? 少なくとも今の私にとっては当たり前じゃないんですが、.NET使い始めのころはやってた気はしますけど。 質問者の方には関係ない話で申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。
noname#160041
noname#160041
回答No.7

>>仮にフォームAとしますけどフォームAのコントロールを他のフォームBが直接操作するためにはpublic(internalとかもありますが)にする必要があります。 >>これをクラスで考えた場合、クラスAのメンバ変数を他のクラスから操作させるがためにpublicにするというのと同じだと思います。 >>通常はクラスAにアクセスするためのメソッドを用意するなりクラスAのプロパティとして定義したりすると思いますが、いかがでしょうか? いかがでしょうも何も、ControlsってのはWindowsFormsで定義されているパブリックのプロパティだぞ。 要は自作した全てのFormにはControlsというパブリックのプロパティが存在する。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.controls.aspx http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.aspx スレッドセーフにするのならデリゲートを使用しないとまずいんだが、そもそもマルチスレッドのGUIアプリなんて、マルチスレッド前提のソースが必要になるから、将来的にマルチスレッドになるかもしれないなんて言う想定レベルのソースじゃ話にならない。 シングルスレッドのGUIアプリなら、インスタンス外からFormのControlsプロパティを操作するのは当たり前の話。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1623/5662)
回答No.6

>何で? >どう言う技術理由? 技術理由というよりは設計思想上の理由といった方があってるかもしれません。 http://okwave.jp/qa/q7487579.htmlの#1の回答者の方も書かれていますがコントロールを操作するのは、そのコントロールを所有するフォームの仕事だからです。 仮にフォームAとしますけどフォームAのコントロールを他のフォームBが直接操作するためにはpublic(internalとかもありますが)にする必要があります。 これをクラスで考えた場合、クラスAのメンバ変数を他のクラスから操作させるがためにpublicにするというのと同じだと思います。 通常はクラスAにアクセスするためのメソッドを用意するなりクラスAのプロパティとして定義したりすると思いますが、いかがでしょうか? またフォームAのコントロールを操作するのがフォームBひとつだけの場合はまだいいですが、フォームC,フォームD…フォームに限らずバックグラウンドのタイマースレッドからなど多数出てきた場合、フォームAのコントロールなのにそのコントロールを操作するコードが各所に散らばるという事態になりかねません。さらにその散らばった状態でコントロールが全く別のコントロール型に仕様変更になったらそれら全て書き換えますか?少なくとも私はそんなことしたくありませんが。 なのでコントロールを所有するフォーム以外のフォームが直接操作するのはお勧めしませんし、コントロールの操作はそのコントロールを所有するフォームがするようにすべきと私は思います。 絶対やるなとはいいませんけど。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C# Form処理

    Form1とForm3からForm2を表示させれるようにして,どちらかのフォームのコントロールをクリック したらform2が立ち上がりformに応じた処理を行いたいのですが,下記のコードではエラーとなって 動きません int Pin1 = f1.butt1; int Pin3 = f3.butt3; if (Pin1 == 1) { int h = f1.but; for (int hj = 1; hj < 43; hj++) { if (h == hj) { //Labelに文字を入力。 string Memo = "label" + (hj + 93); string Hd = "label" + (hj + 51); Label f1_Memo = (Label)f1.Controls[Memo]; f1_Memo.Text = this.textBox1.Text; Label f1_Hd = (Label)f1.Controls[Hd]; f1_Hd.Text = this.textBox2.Text; } } } else if (Pin3 == 1) { int h3 = f3.but3; for (int hj3 = 1; hj3 < 43; hj3++) { if (h3 == hj3) { //Labelに文字を入力。 string Memo = "label" + (hj3 + 744); MessageBox.Show(Memo.ToString()); Label f3_Memo = (Label)f3.Controls[Memo]; f3_Memo.Text = this.textBox1.Text; } } } Form1のコントロールであれば上のforループ,Form3であれば下のforループで処理するように考えております.Form1でform3を開くコントロールを選択した場合上記コードのbutt1は0になるように しているつもりです. エラーは NullReferenceExceptionがハンドルされませんでした. オブジェクト インスタンスの作成には new キーワードを使用します。 何がいけなくてどう対処すればよろしいのでしょうか? ご教授よろしくお願いいたします.

  • C# DataGridViewにデータを追加したい。

    C# DataGridViewにデータを追加したい。 DataGridViewにレコードを追加したいのですが、Formのロードイベントで以下コードを実行しています。 // テーブルを作成 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int)); DataColumn dataClumn2 = dataTable1.Columns.Add("名前", typeof(int)); // テーブルにデータを追加 dataTable1.Rows.Add(new Object[] { 1, name1}); dataTable1.Rows.Add(new Object[] { 2, name2}); dataGridView1.DataSource = dataTable1; としています。 Formにボタンを配置し、ボタンクリック時にテキストボックス[txtProName]のデータを レコード追加したいのですが、記入の仕方がわかりません。 まず、 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); をロードイベントメソッドに記入しているのも問題がありそうなのですが、 良く理解できません。 ボタンイベントでデータを挿入する方法等、記入方法のご教授よろしくお願いいたします。 当方、超初心者なので、出来れば、ソースコードもお願いいたします。m(_ _)m

  • VB2005でデータグリッドビューにTextBoxのセルとComboBoxのセルを表示

    はじめまして。プログラム開発初心者です。よろしくお願いいたします。 OSはWin2000、VB2005でプログラムを作成しています。 データベースはACCESS2000を使用しています。 今回はデザイナではなく、プログラムにてDatagridView.ROWS.ADDで行追加したいと思っています。 フォームにデータグリッドビューを配置し、三つのカラムにデータベースから持ってくるデータをを表示させたいと思っています。 ただし三つ目のカラムをコンボボックスにして 4つのデータを用意してデータを変更できるようにしたいと思っています。 DatagridView.ROWS.ADDにてテキストボックスカラムを二つ、コンボボックスの列を一つ行追加するにはどのようにしたらいいのでしょうか? またそのコンボボックスの中身の設定はどのようにしたらよいのでしょうか? テキストボックスのみの行追加はできるのですが。。。 テキストボックスカラム+コンボボックスのカラムを追加する方法を調べたのですが探しきれませんでした。 お知恵をおかしください。

  • SQL Server2012 とC#

    DataGridViewで選択した行を他の処理に渡したくて、Netで調べて、次のようにしてみました。 DataSet ds = new DataSet(); SqlDataAdapter adpt = new SqlDataAdapter(); DataTable tbl = new DataTable("Movies"); ds.Tables.Add(tbl); for(int i=0; i<DataGrifView1.ColumnCount; i++){ tbl.Columns.Add(DataGridVew1.Columns[i].Name,DataGridView1.Columns[i].ValueType); } foreach(DataGridViewRow dr in DataGridView1.SelectedRows){ DataRowView rv= (DataRowView)dr.DataBoundItem; tbl.ImportRow(rv.Row); } ここで、出来たDataSet dsを、他のフォームに渡しました。そのフォームにはDataBindingNavigator1と、内容を表示するためのテキストボックスがあります。フォームLoadで次のように ナビゲータと各テキストに設定しました。 BindingSource1.DataSource = ds; BindingSource1.DataMember = "Movies"; DataBindingNavigator1.BindingSource = BindingSource1; textBox1.DataBindings.Add(new Binding("Text", ds, "Movies.邦題")); textBox2.DataBindings.Add(new Binding("Text", ds, "Movies.原題")); textBox3.DataBindings.Add(new Binding("Text", ds, "Movies.読み")); textBox4.DataBindings.Add(new Binding("Text", ds, "Movies.制作国")); textBox5.DataBindings.Add(new Binding("Text", ds, "Movies.制作年")); textBox6.DataBindings.Add(new Binding("Text", ds, "Movies.上映時間")); DataGridViewの複数の行を選択して、この処理を行うと、ナビゲータには、Rowの行数分だけのレコード数の分母が表示され、各テキストにはそれぞれのレコードの内容の内の一件分が表示されています。 Q1:  ここで、ナビゲータの進むボタンを押してみると、レコード位置を示す数(分子の方)が進むのに、テキストの内容が変化しません。何か、やり足りないのでしょうか? Q2:  DataGridViewの左上の行ヘッダと列ヘッダの交わる部分をクリックして、全選択(のつもりで)この処理を呼ぶと、SelectedRowの内容が読めないようで、NullReferenceExceptionのハンドルされていない例外が発生して、「オブジェクト参照がオブジェクトインスタンスに設定されていません」と言われます。デバッガでSelectedRowを追っても、行数はあるものの内容がありません。全選択は使用方法が違うのでしょうか?

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

    フォーム間のデータ(パラメータ等)の受け渡しについて教えてください。 現在Form1からForm2を起動させる場合、以下のようにForm2のインスタンスの生成時のパラメータを設定してもForm2のLoadイベントでは拾うことはできないのでしょうか? ↓実際のコード //Form1クラスのインスタンスを作成する //引数(a,b) Form2 f = new Form2(a,b); //Form1を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose(); また、上記の方法が違っていた場合、方法としてどのようなやり方があるのか教えてください。 よろしくお願いいたします。

  • Form1からForm2へ値渡しの際

    DataGridViewでForm1で選択した行の1列目と3列目だけを、Form2のDataGridViewに表示するコードを書いています。 DataGridViewでForm1からForm2へ値渡しの際、複数行選択→ダブルクリックするとForm2が1行ずつ、行の選択数分出てしまいます。 Form2のDataGridViewに選択数分の行(例えば3行選択ならForm2のDataGridViewの画面に3行)出るようにしたいです。 ご教授お願い致します。 【Form1】 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { //選択した行の取得 foreach (DataGridViewRow r in dataGridView1.SelectedRows) { //詳細画面を開く Form2 f2 = new Form2(); //選択行をForm2に渡す f2.setRowData(r); //Form2を開く f2.Show(); } } 【Form2】 public void setRowData(DataGridViewRow r) { //1列目と3列目を取り出す string s1 = r.Cells[1].Value.ToString(); string s2 = r.Cells[3].Value.ToString(); // データを作成する DataTable dt = createData(); //データテーブル(DGVの中身)にいれる dt.Rows.Add("2023年",s1,s2); //一覧を表示する dataGridViewDisp2(dt); }

  • [C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません

    DataGridViewへのコンボボックス利用で躓いております。 DataGridViewのAutoGenerateColumnsをfalseにし、dataGridView.DataSourceにデータベースから読み込んだデータテーブルを指定しています。 次にdataGridViewにDataGridViewComboBoxColumnを追加し、DataPropertyNameにコンボボックスに対応させたい データテーブルのCaptionを指定することで、データテーブルとコンボボックスを関連付けています。 実行後の表示は想定通りなのですが、コンボボックスでアイテムを選択するとdataGridView上では値が更新されて、データテーブルには変更が反映されていません。 ちなみにコンボボックスでは、ValueMemberとDisplayMemberを設定し、DataGridView上ではstring、 内部的にはlongでデータ管理を行いたいと思っています。 どうにも解決方法が見いだせないので、こちらに質問させていただきました。 ソースを貼りつけるのでご指摘をお願いします。 利用しているデータベース |ID|ペットID| |1 |1| |2 |1| |3 |3| 以下ソースでは上記データベースのデータテーブルをpdtとしています。 コンボボックスのデータテーブル作成 DataTable comboTable = new DataTable(); comboTable.Columns.Add("ID", typeof(long)); comboTable.Columns.Add("NAME", typeof(string)); string[,] rowDataArray =      {{"1", "犬"},      {"2", "猫"},      {"3", "魚"}}; for(i=0;i<rowDataArray.GetLength(0);i++) {    DataRow row = comboTable.NewRow();    row["ID"] = rowDataArray[i, 0];    row["NAME"] = rowDataArray[i, 1];    comboTable.Rows.Add(row); } comboTable.AcceptChanges(); //コンボボックスを作成しコンボボックステーブルをバインド DataGridViewComboBoxColumn cbc = new DataGridViewComboBoxColumn(); cbc.DataSource = comboTable; cbc.DisplayMember = "NAME"; cbc.ValueMember = "ID"; cbc.DataPropertyName = pdt.ペットIDColumn.Caption; cbc.DisplayStyleForCurrentCellOnly = true; //dataGridViewにデータテーブルをバインド dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = pdt; dataGridView1.Columns.Add(cbc); これを実行すると |犬| |犬| |魚| とdataGridViewに表示され、コンボボックスでは、犬、猫、魚が選べます。 一行目において、コンボボックスから猫を選択するとdataGridViewは下記のようになるのですが |猫| |犬| |魚| この後ブレークよりデータテーブルとdataGridViewを見ると pdt[0][0] = 1 dataGridView1.Rows[0].Cells[0].Value = 2 となっており、dataGridViewの値は更新されているのに、データテーブルでは更新されていませんでした。 今まで、dataGridView上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、 コンボボックスを使うようにしたら更新されなくなりました。 皆様、解決方法を教えていただけますでしょうか。

  • C#でのForm間のデータ受け渡し、保存について。

    C#でシステム作成をしています。WindowsFormApplicationです。 どのようなシステムかと申しますと、学習システムです。 親フォームForm1には、問題ページForm2へ行くボタン、保存ボタン、開くボタンが配置されています。 問題ページForm2へ行くと、数十個の数字labelがあり、この各labelから実際の問題へ、つまり、Form3、Form4、…と行きます。 さらにForm3、Form4、…の各問題を終える度に、Form3、Form4…からその都度別Forms(集計のsとしておきます。)を開いて集計していきます。(数値を扱うので。) Form1からForm2は同時表示、Form2のlabelからのForm3、4…はForm2をHideして表示(Hideについては後述)、Form3、4…からFormsは、もちろん3、4を参照しながら集計するので同時表示です。 Form2のHideについては、例えばForm3の問題を解き、Formsを開いて集計したなら、Form3をCloseすると、Form2を再度ShowしてForm3へのlabelのForeColorを変化させます。同時にFormsはHideします。(また次のForm4で使うため。)変色labelを再度押すと、「解答済みです」とMessageBoxに表示して行けなくなります。 このように進めていくタイプのシステムを作成しています。 以上まではうまくいきました。 ここからが問題です。 Form2のlabelの色は、Form2を閉じない限りはもちろん保持されます。しかし、閉じて再度Form1から表示すると色が保持されているプログラムを書きたいのですが、どのようにすればいいでしょうか? ちなみにHideではだめだと思います。なぜなら、初めてこのシステムに取り掛かる際、Form1からForm2を表示する時に、HideされたForm2はまだ存在しないからです。 だからデータの受け渡し、つまり、Form2を閉じる時にForm1へデータを渡し、再度開く際にForm2へそのデータを返す、というイメージですかね。 インターネット上では、テキストボックスのテキストデータの例ばかりでしっくりきません。 渡すとしてもForm1のどこに渡すのか(どこにプログラムを?)も分かりません。 Form2から受け取る際は、Loadイベントでしょう。Form2から渡す際はClosedイベントで渡すとは思いますが…。 そしてあと一つ、Form1の保存ボタン、開くボタンのプログラムです。 学習システムで少しずつ進めていくプログラムですから、この日はここまで、と保存していく必要があります。 それを開く意味で、開くボタンも付けています。 このプログラムも難しくて分からないところですが、これも質問すると質問が多くなるため置いておきます。(というより先述の受け渡しのプログラムの質問が優先です。) 質問は、このシステムのForm1から保存することで、きちんと進度は保存されるかということです。 ある日、あるところまで問題を解き(labelの色を変え)、集計し終えたとします。 そして保存して、別の日に開くとForm1が現れます。 このForm1からForm2へ行くと、ちゃんと色が保持されたプログラムは書けるでしょうか? (ちゃんとデータの受け渡しプログラムを書いたと想定。要はlabelの変色のみ保存できればいいのです。) そしてFormsへ飛ぶと、データは保持されているでしょうか? Formsは先述しましたが、集計し終えるとHideするのみです。つまりFormsは初めて表示したらもうCloseはしません。 このようにHideしたFormの状態も保持することはできるでしょうか?

  • C# form

    Button _Button = (Button)sender; int but = 0; if (_Button.Name == "button1") { but = 1; } if (_Button.Name == "button2") { but = 2; } if (_Button.Name == "button3") { but = 3; }      //Form2クラスのインスタンスを作成する Form2 f2 = new Form2(this); //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f2.Show(); 上記のようにボタン配列を作成し,クリックイベントを発生させています.そこで押されたボタンにより butに所定の値を入れてこれを,form2において判断値として使用したいのですが,どのようにすれば 良いでしょうか? 昨日から悩んでいるのですが自分だけでは解らないのでご教示願いたいと思います.

  • 「Me」を「Form1」にするとエラーになる理由

    VB2008です。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "a" Form1.Text = "a" ’←「Form1.Text」に波線ができる。 End Sub End Class というように、 「Me」を「Form1」にすると 「既定のインスタンスからそれ自体を参照できません。'Me' を使用してください。」 となります。 VBAなら「Me」を「Form1」にしてもエラーにならないのに、 どうしてVBだとエラーになるのでしょうか?