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

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

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

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

Visual Studio

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

27626閲覧

C#.netでフォームの遷移

mnsc10

総合スコア34

C#

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

Visual Studio

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

5クリップ

投稿2015/11/19 05:39

###前提・実現したいこと
C#.netでフォームの遷移を行いたいのですが、新しいフォームが開いてしまい困っています。
新しいウィンドウではなく同じウィンドウで違うフォームを開くことはできないのでしょうか。

また、フォーム1からフォーム2に文字列を渡し、フォーム2のラベルに受け取った文字列を表示
したいのですが、開いた時点ではには何も表示されずボタンを押すと表示されます。
開いた時点で表示することはできないのでしょうか。

よろしくお願いします。

###ソースコード
フォーム1
private void kaishalist_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var id = kaishalist[e.ColumnIndex, e.RowIndex].Value;
MessageBox.Show(id.ToString());
this.name = id.ToString();
Form2 f = new Form2(this);
f.Show();
}

フォーム2
public partial class Form2 : Form
{
Form1 form1;

public Form2(Form1 mainForm) { this.form1 = mainForm; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label1.Text = form1.name; } private void Form2_Load(object sender, EventArgs e) { label1.Text = form1.name; } }

###補足情報(言語/FW/ツール等のバージョンなど)
visual studio 2015
Visual C#
.net 4.5
windows フォームアプリケーション
で作成しています。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ああ、それですか。私もC#を始めたばかりの頃はどうやるのかあれこれ試行錯誤していたことがあります。

フォームを別のフォームに貼り付けて使用することはできません。フォームに貼り付けられるのはコントロールです。Tak1waさんも触れていますが「ユーザーコントロール」を使用します。

プロジェクトに追加するときに、Windowsフォームではなく「ユーザーコントロール」というのがあるので、それを選択します。すると、タイトルバーなどがないただの四角いウィンドウが現れるので、好きなだけボタンなりテキストなりを並べてください。
そして、いったんビルドすると、ツールボックスに追加したユーザーコントロールが現れて選択できるようになるので、フォームの好きな位置に貼り付けてご使用ください。もちろん、プログラム内でnewして表示させてもかまいません。

開いた時点ではには何も表示されずボタンを押すと表示されます。

これですが、Form2_Loadメソッドは、コピペではなく、ちゃんとフォームのプロパティのイベントで追加しましたか? 一応こちらで同じことをして確認しましたが、ちゃんとForm2_Loadメソッドが呼ばれてテキストが渡されています。

投稿2015/11/19 06:11

編集2015/11/19 06:22
catsforepaw

総合スコア5938

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

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

nexstar

2015/11/19 06:23

FormもControlの一つなので貼り付けられますよ。 var f = new Form2(this); f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; f.TopLevel = false; f.Location = new Point(0, 0); f.Show(); this.Controls.Add(f);
catsforepaw

2015/11/19 06:30

なんと、そうでしたか。でも、普通はユーザーコントロール使いますよね?
nexstar

2015/11/19 06:48

そうですね。事前にわかっていれば、私もUserControlを使うと思います。
catsforepaw

2015/11/19 06:50

良かった。すごい勘違いをしていたのかと、ちょっと不安になってしまいました。
mnsc10

2015/11/19 07:01

ありがとうございます。
mnsc10

2015/11/19 07:18

何度もすみません。ユーザーコントロールを切り替えるときのコードはどのような記述になるのでしょうか
catsforepaw

2015/11/19 14:14

一番簡単なのはあらかじめ必要なだけコントロールを作っておいて(あるいはフォームに貼り付けておいて)、表示したいものだけを表示し、他は非表示にするという方法です。Show()とHide()で表示/非表示を切り替えます。
guest

0

もう解決済みとのことですが、切り替えの方法の1つを紹介しておきます。

ベースとなるフォームにユーザーコントロールを乗せ替えるという考え方です。
動くのを確認した方がわかりいいと思いますので、サンプルコードを掲載します。

1)Windowsフォームアプリケーションプロジェクトの新規プロジェクトを作成してください。
2)自動的に作成されたForm1.csのコードを表示して、下のForm1.csに書き換えて下さい。
3)ユーザーコントロールを2つ追加して下さい。(UserControl1.cs、UserControl2.cs)
4)コードを表示して、それぞれ、下のUserControl1.cs、UserControl2.csに書き換えて下さい。
5)ビルド&実行します。nextボタンを押すとUserControl1、UserControl2が切り替わります。

C#

1//Form1.cs 2public partial class Form1 : Form 3{ 4 public Form1() 5 { 6 InitializeComponent(); 7 this.Load += new System.EventHandler(Form1_Load); 8 } 9 10 private void Form1_Load(object sender, EventArgs e) 11 { 12 Next(typeof(UserControl1)); 13 } 14 15 public void Next(Type t) 16 { 17 if (t == null) 18 { 19 Close(); return; 20 } else { 21 this.Controls.Clear(); 22 var uc = Activator.CreateInstance(t) as UserControl; 23 this.Controls.Add(uc); 24 } 25 } 26}

C#

1//UserControl1.cs 2public partial class UserControl1 : UserControl 3{ 4 private System.Windows.Forms.Button button1; 5 6 public UserControl1() 7 { 8 InitializeComponent(); 9 10 this.button1 = new System.Windows.Forms.Button(); 11 this.SuspendLayout(); 12 this.button1.Location = new System.Drawing.Point(110, 145); 13 this.button1.Name = "button1"; 14 this.button1.Size = new System.Drawing.Size(75, 23); 15 this.button1.TabIndex = 0; 16 this.button1.Text = "next"; 17 this.button1.UseVisualStyleBackColor = true; 18 this.button1.Click += new System.EventHandler(this.button1_Click); 19 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 20 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 21 this.BackColor = System.Drawing.Color.Red; 22 this.Controls.Add(this.button1); 23 this.Name = "UserControl1"; 24 this.Size = new System.Drawing.Size(300, 300); 25 this.ResumeLayout(false); 26 } 27 28 private void button1_Click(object sender, EventArgs e) 29 { 30 (Parent as Form1).Next(typeof(UserControl2)); 31 } 32}

C#

1//UserControl2.cs 2public partial class UserControl2 : UserControl 3{ 4 private System.Windows.Forms.Button button1; 5 private System.Windows.Forms.Button button2; 6 7 public UserControl2() 8 { 9 InitializeComponent(); 10 11 this.button1 = new System.Windows.Forms.Button(); 12 this.button2 = new System.Windows.Forms.Button(); 13 this.SuspendLayout(); 14 this.button1.Location = new System.Drawing.Point(65, 136); 15 this.button1.Name = "button1"; 16 this.button1.Size = new System.Drawing.Size(75, 23); 17 this.button1.TabIndex = 0; 18 this.button1.Text = "next"; 19 this.button1.UseVisualStyleBackColor = true; 20 this.button1.Click += new System.EventHandler(this.button1_Click); 21 this.button2.Location = new System.Drawing.Point(146, 136); 22 this.button2.Name = "button2"; 23 this.button2.Size = new System.Drawing.Size(75, 23); 24 this.button2.TabIndex = 0; 25 this.button2.Text = "close"; 26 this.button2.UseVisualStyleBackColor = true; 27 this.button2.Click += new System.EventHandler(this.button2_Click); 28 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 29 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 30 this.BackColor = System.Drawing.Color.Blue; 31 this.Controls.Add(this.button2); 32 this.Controls.Add(this.button1); 33 this.Name = "UserControl2"; 34 this.Size = new System.Drawing.Size(300, 300); 35 this.ResumeLayout(false); 36 } 37 38 private void button1_Click(object sender, EventArgs e) 39 { 40 (Parent as Form1).Next(typeof(UserControl1)); 41 } 42 43 private void button2_Click(object sender, EventArgs e) 44 { 45 (Parent as Form1).Next(null); 46 } 47}

投稿2015/11/19 13:57

nexstar

総合スコア53

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

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

mnsc10

2015/11/20 00:45

ここもでしていだだき、本当にありがとうございます。 この場合ですとユーザーコントロール1からユーザーコントロール2に値を渡すときはどのような記述になるのでしょうか。
nexstar

2015/11/20 01:24

動作確認していませんが、こんな感じになります。文字列を渡す例です。 Form1クラスに以下の引数付きNextメソッドを追加します。 public void Next(Type t, string param) { if (t == null) { Close(); } else { this.Controls.Clear(); var uc = Activator.CreateInstance(t, new object[] { param } ) as UserControl; this.Controls.Add(uc); } } UserControl1.cs、UserControl2.csに引数を受け取るコンストラクタを追加します。 public UserControl1(string param) { UserControl1(); MessageBox.Show(param); } public UserControl2(string param) { UserControl2(); MessageBox.Show(param); } Nextメソッドを呼んでいる箇所を、引数付きのNextメソッドに変更します。 (Parent as Form1).Next(typeof(UserControl1), "引数");
mnsc10

2015/11/20 02:07

本当にありがとうございました。
guest

0

こんにちは。

ウィザード形式のページングということですよね。
やったことないですが…原始的に考えると以下のどれかになるのではないでしょうか。

  • ユーザコントロールを切り替える
  • タブページを切り替える
  • MDI最大化で子画面を切り替える

もっとスマートな方法があれば良いですが…

#余談ですが、WPFであればContentFrameなどによるナビゲーション機能がありますので
スマートに実装できます。

投稿2015/11/19 05:46

編集2015/11/19 05:50
Tak1wa

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問