質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

Visual studio 2015 フォーム間での値の受け渡し

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,120

niko2

score 15

実現したいこと

Visual Studio 2015 でC#を使用しシステムを開発しています。

現在、日々のトレーニングなどを記録するシステムのカレンダー部分を作っています。

実現したいことは、日付のlabelをクリックするとその日付の画面に飛び、その日の予定一覧が表示されることです。

日々の予定はPostgreSQLに格納していきます。
(テーブルの列 year(int) month(int) day(int) week(text) schedule1(text) schdule2 … schedule10)

これを実現させる方法として、以下を考えています。
例:画像1(2016年9月7日のlabelをクリックした場合
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Form1:画像1
If(選択した年月日のレコードが存在していない){
---レコードを作成(クリックしたlabelのyearとmonthとdayとweekを入れる)

year,month, dayをForm2に渡す。

Form2:画像2
下記のC#のソースに以下の2点を追加(下記のソースは追加を反映していないもの)。

  • year,month,dayをForm1から受け取る。
  • データ検索にてyear,month,dayをもとに検索
private void connectDatebase()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Server=localhost;");
            sb.Append("Port=5433;");
            sb.Append("User Id=postgres;");
            sb.Append("Password=****;"); //インストール時入れた値
            sb.Append("Database=db_football;");

            string connString = sb.ToString();

            using (var con = new NpgsqlConnection(connString))
            {
                try
                {
                    con.Open();



                    //データ検索
                    var cmd = new NpgsqlCommand(@"select schedule1,schedule2,schedule3,schedule4,schedule5,schedule6,schedule7,schedule8,schedule9,schedule10 from tb_calendar;", con);
                    var dataReader = cmd.ExecuteReader();  //クエリを取得
                    while (dataReader.Read()) //レコードを進める
                    {

                        label4.Text = dataReader["schedule1"].ToString();
                        label5.Text = dataReader["schedule2"].ToString();
                        label6.Text = dataReader["schedule3"].ToString();
                        label7.Text = dataReader["schedule4"].ToString();
                        label3.Text = dataReader["schedule5"].ToString();
                        label9.Text = dataReader["schedule6"].ToString();
                        label10.Text = dataReader["schedule7"].ToString();
                        label11.Text = dataReader["schedule8"].ToString();
                        label12.Text = dataReader["schedule9"].ToString();
                        label13.Text = dataReader["schedule10"].ToString();
                    }


                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
        }

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

例:画像1の2016年9月7日のlabelをクリックすると画像2のフォームに移動し、その日の予定が入ることです。
イメージ説明
イメージ説明

「この質問の本題」

しかし、上記のことを実現するにはフォーム間で値(year,month,day,week)を受け渡さなければなりません。
実現する方法をお教えいただけないでしょうか?

もしくは上記(質問の最初に記述)実現したいことを可能にする別の良い方法があれば教えていただきたいです。

フォーム間での値の受け渡しを実現するために試したことは下記にまとめています。

試したこと

  • publicを使い下記のようにForm1,Form2に定義する(Form1、Form2別々の変数として扱われ失敗)
namespace CalendarDetails
{
    public partial class CalendarDetails : Form
    {
        public int year;
    public int month;
        public int day;
        public string week;
  • http://d.hatena.ne.jp/mena621/20120726/1343284569を参考しようとしたが、親子間のフォームでの方法であった(今回はどちらも子フォームで親(メイン)フォームは別にある)

補足情報(言語/FW/ツール等のバージョンなど)

  • Visual Studio2015
  • C#
  • Postgres9.5
  • Npgsql 3.1.9
  • Form1,Form2ともに子フォーム、(親(メイン)フォームは別にある)

現状のForm1の画面遷移部分

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Nqgsql;

namespace WindowsFormsApplication1
{
    public partial class Calendar : Form
    {
        public Calendar()
        {
            InitializeComponent();
        }



        private void button1_Click(object sender, EventArgs e)/戻るボタンの処理(今回の質問に関係なし)
        {
            Windows1.Menu menu = new Windows1.Menu();
            menu.Show();
            Close();
        }

        private void label13_Click(object sender, EventArgs e)/日付ラベルをクリックするとその日の予定画面を開く
        {
            CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails();
            calendardetails.Show();
            Close();
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2016/11/24 00:46

    何がわからないのでしょうか。ほぼ答えは出てそうですが。あと、画面遷移処理くらいはコード提示したほうがスムーズです。

    キャンセル

  • niko2

    2016/11/24 01:51

    Tak1waさん ご指摘ありがとうございます。 「この質問の本題」を修正、Form1の画面遷移を追加させていただきました。 フォーム間での値の受け渡し方法 もしくは 質問の最初にある「実現したいこと」を私が考えている方法以外でで可能にする手段があればお教えいただきたいです。

    キャンセル

回答 1

checkベストアンサー

+1

こんにちは。

フォームに値を渡すにはインスタンス作成後に呼び出し元から渡してやれば良いです。

CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails();
calendardetails.year = 2016;
calendardetails.month = 9;
calendardetails.day = 7;
calendardetails.week = "土";
calendardetails.Show();

プロパティを公開するべきだとか、渡す値をどこから取得するか、などなどありますが。
まずは値を渡す方法まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/25 17:22

    label1.Text = year.ToString();
    をFormLoadに移動しましたら、値の受け渡しに成功しました。
    コンストラクタだと値が渡される前に実行されるのですね。
    つまり、画面が呼び出される前から実行されてるって理解でいいんですかね、
    勉強不足の私からすると不思議です。

    長々と回答ありがとうございます。
    ベストアンサーに選ばせていただきました。
    これからもお世話になるかもしれませんが、何卒よろしくお願いします。

    キャンセル

  • 2016/11/25 17:59

    コンストラクタはnewされたタイミングで走ります

    キャンセル

  • 2016/11/25 20:55

    なるほど。Form1で
    CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails();
    を行った段階で走っているんですね。
    理解しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる