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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

4625閲覧

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

niko2

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

2クリップ

投稿2016/11/23 15:10

編集2016/11/23 16:46

###実現したいこと
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をもとに検索

C#

1 private void connectDatebase() 2 { 3 StringBuilder sb = new StringBuilder(); 4 sb.Append("Server=localhost;"); 5 sb.Append("Port=5433;"); 6 sb.Append("User Id=postgres;"); 7 sb.Append("Password=****;"); //インストール時入れた値 8 sb.Append("Database=db_football;"); 9 10 string connString = sb.ToString(); 11 12 using (var con = new NpgsqlConnection(connString)) 13 { 14 try 15 { 16 con.Open(); 17 18 19 20 //データ検索 21 var cmd = new NpgsqlCommand(@"select schedule1,schedule2,schedule3,schedule4,schedule5,schedule6,schedule7,schedule8,schedule9,schedule10 from tb_calendar;", con); 22 var dataReader = cmd.ExecuteReader(); //クエリを取得 23 while (dataReader.Read()) //レコードを進める 24 { 25 26 label4.Text = dataReader["schedule1"].ToString(); 27 label5.Text = dataReader["schedule2"].ToString(); 28 label6.Text = dataReader["schedule3"].ToString(); 29 label7.Text = dataReader["schedule4"].ToString(); 30 label3.Text = dataReader["schedule5"].ToString(); 31 label9.Text = dataReader["schedule6"].ToString(); 32 label10.Text = dataReader["schedule7"].ToString(); 33 label11.Text = dataReader["schedule8"].ToString(); 34 label12.Text = dataReader["schedule9"].ToString(); 35 label13.Text = dataReader["schedule10"].ToString(); 36 } 37 38 39 } 40 catch (Exception e) 41 { 42 MessageBox.Show(e.ToString()); 43 } 44 } 45 }

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

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

###「この質問の本題」

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

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

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

###試したこと

  • publicを使い下記のようにForm1,Form2に定義する(Form1、Form2別々の変数として扱われ失敗)

C#

1namespace CalendarDetails 2{ 3 public partial class CalendarDetails : Form 4 { 5 public int year; 6 public int month; 7 public int day; 8 public string week;

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

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

###現状のForm1の画面遷移部分

Visual

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using Nqgsql; 11 12namespace WindowsFormsApplication1 13{ 14 public partial class Calendar : Form 15 { 16 public Calendar() 17 { 18 InitializeComponent(); 19 } 20 21 22 23 private void button1_Click(object sender, EventArgs e)/戻るボタンの処理(今回の質問に関係なし) 24 { 25 Windows1.Menu menu = new Windows1.Menu(); 26 menu.Show(); 27 Close(); 28 } 29 30 private void label13_Click(object sender, EventArgs e)/日付ラベルをクリックするとその日の予定画面を開く 31 { 32 CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails(); 33 calendardetails.Show(); 34 Close(); 35 } 36 } 37}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2016/11/23 15:46

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

2016/11/23 16:51

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

回答1

0

ベストアンサー

こんにちは。

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

csharp

1CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails(); 2calendardetails.year = 2016; 3calendardetails.month = 9; 4calendardetails.day = 7; 5calendardetails.week = "土"; 6calendardetails.Show();

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

投稿2016/11/23 16:55

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niko2

2016/11/24 05:25

Taj1waさん 回答ありがとうございます。 渡す値は、year,monthは comboBoxから、dayはlabelから、weekについては検討中です。 プロパティとは下記のForm2に記述したものであっているでしょうか? Form1からForm2からの画面遷移時に ```C# CalendarDetails.CalendarDetails calendardetails = new CalendarDetails.CalendarDetails(); calendardetails.year = 2016; calendardetails.month = 9; calendardetails.day = 7; calendardetails.week = "土"; calendardetails.Show(); ``` Form2に ```C# public partial class CalendarDetails : Form { public int year { get; internal set; } public int month { get; internal set; } public int day { get; internal set; } public string week { get; internal set; } ``` としましたが、Form2に値は渡せすことができていませんでした。 Form2でのyear,monthなどの定義の仕方が間違えているのでしょうか?
Tak1wa

2016/11/24 05:30

む、問題なさそうに見えますが、Form2で値が渡されているかどのように確認されてますか?
niko2

2016/11/24 08:04

回答気付かず飛び飛びになって申し訳ないです。 Form2にて label1.Text = year.ToString(); と記述し実行して、 yearの中身を確認しました。 結果はlabel1に0が表示されました。 試しに Form2に year = 4; と代入してから label1.Text = year.ToString(); を実行すると当たり前ですがlabel1に4が表示されました。
Tak1wa

2016/11/24 08:07

year.ToStringしたタイミングはいつですか?コンストラクタではダメですよ。
niko2

2016/11/24 08:21

以下のタイミングでしています。 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 Npgsql; namespace CalendarDetails { public partial class CalendarDetails : Form { Label firstClicked = null; Label secondClicked = null; public int year { get; internal set; } public int month { get; internal set; } public int day { get; internal set; } public string week { get; internal set; } public CalendarDetails() { InitializeComponent(); label1.Text = year.ToString(); //←このタイミング connectDatebase(); }
Tak1wa

2016/11/24 13:30

そのタイミングはコンストラクタなのでまだ呼び出し元から値が渡されていません。 FormLoadなどで値を確認するようにしては如何でしょう。
niko2

2016/11/25 08:22

label1.Text = year.ToString(); をFormLoadに移動しましたら、値の受け渡しに成功しました。 コンストラクタだと値が渡される前に実行されるのですね。 つまり、画面が呼び出される前から実行されてるって理解でいいんですかね、 勉強不足の私からすると不思議です。 長々と回答ありがとうございます。 ベストアンサーに選ばせていただきました。 これからもお世話になるかもしれませんが、何卒よろしくお願いします。
Tak1wa

2016/11/25 08:59

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

2016/11/25 11:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問