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

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

ただいまの
回答率

90.75%

  • C#

    6568questions

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

  • Visual Studio

    1699questions

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

  • .NET Framework

    425questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 9,790

mnsc10

score 24


前提・実現したいこと

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 フォームアプリケーション  
で作成しています。  

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/19 15: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);

    キャンセル

  • 2015/11/19 15:30

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

    キャンセル

  • 2015/11/19 15:48

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

    キャンセル

  • 2015/11/19 15:50

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

    キャンセル

  • 2015/11/19 16:01

    ありがとうございます。

    キャンセル

  • 2015/11/19 16:18

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

    キャンセル

  • 2015/11/19 23:14

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

    キャンセル

+1

こんにちは。

ウィザード形式のページングということですよね。
やったことないですが…原始的に考えると以下のどれかになるのではないでしょうか。
  • ユーザコントロールを切り替える
  • タブページを切り替える
  • MDI最大化で子画面を切り替える
もっとスマートな方法があれば良いですが…

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

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

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

//Form1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += new System.EventHandler(Form1_Load);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Next(typeof(UserControl1));
    }

    public void Next(Type t)
    {
        if (t == null)
        {
            Close(); return;
        } else {
            this.Controls.Clear();
            var uc = Activator.CreateInstance(t) as UserControl;
            this.Controls.Add(uc);
        }
    }
}
//UserControl1.cs
public partial class UserControl1 : UserControl
{
    private System.Windows.Forms.Button button1;

    public UserControl1()
    {
        InitializeComponent();

        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        this.button1.Location = new System.Drawing.Point(110, 145);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(75, 23);
        this.button1.TabIndex = 0;
        this.button1.Text = "next";
        this.button1.UseVisualStyleBackColor = true;
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.Red;
        this.Controls.Add(this.button1);
        this.Name = "UserControl1";
        this.Size = new System.Drawing.Size(300, 300);
        this.ResumeLayout(false);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).Next(typeof(UserControl2));
    }
}
//UserControl2.cs
public partial class UserControl2 : UserControl
{
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;

    public UserControl2()
    {
        InitializeComponent();

        this.button1 = new System.Windows.Forms.Button();
        this.button2 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        this.button1.Location = new System.Drawing.Point(65, 136);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(75, 23);
        this.button1.TabIndex = 0;
        this.button1.Text = "next";
        this.button1.UseVisualStyleBackColor = true;
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Location = new System.Drawing.Point(146, 136);
        this.button2.Name = "button2";
        this.button2.Size = new System.Drawing.Size(75, 23);
        this.button2.TabIndex = 0;
        this.button2.Text = "close";
        this.button2.UseVisualStyleBackColor = true;
        this.button2.Click += new System.EventHandler(this.button2_Click);
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.Blue;
        this.Controls.Add(this.button2);
        this.Controls.Add(this.button1);
        this.Name = "UserControl2";
        this.Size = new System.Drawing.Size(300, 300);
        this.ResumeLayout(false);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).Next(typeof(UserControl1));
    }

    private void button2_Click(object sender, EventArgs e)
    {
        (Parent as Form1).Next(null);
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/20 09:45

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

    キャンセル

  • 2015/11/20 10: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), "引数");

    キャンセル

  • 2015/11/20 11:07

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

    キャンセル

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

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

関連した質問

  • 解決済

    Form間での構造体の受け渡しについて

    VisualStdio2013 C# windowsフォームアプリケーションでプログラムを組んでいます。  Form1のpicturebox1に始点(x1,y1)から終点(x2,

  • 解決済

    C# フローティングウインドウ(ツールバー)の作り方

    お世話になります。 C#を使ってFormプログラミングを行っています。 お絵かき系ソフトでよくあるような、フローティングしているウインドウを造りたいと思うのですが(メインウインド

  • 受付中

    Visual StudioでHTMLのようなアンカーテキストを使用する方法

    あるリンクをクリックするとそのページ内の特定の位置まで移動する機能を実装したいと思っています。 どういう風なツール、アルゴリズムを用いるべきか教えてください。

  • 受付中

    C# 処理の繰り返し

    現在チェックボックスにチェックがあったら1、なければ0のような処理を書いています。 この処理をチェックBox1-177と、膨大な数なため、forで回したいと思うのですが、エラーに

  • 解決済

    C#で実現する画面遷移

    現在作成中のプログラムの仕様書(一部抜粋) ○ C#のWindows Form アプリケーションを使用する ○ フォームを複数用意する ○ Form1(起動時の画面)に設置さ

  • 解決済

    ASP.NETにおける、実行時にコントロールの配列の作成する方法を教えてほしい

    前提・実現したいこと 私は、Visual Studioの環境で、とあるWebページを作るために、ASP.NETを用いて、プログラムの実行時に指定した数のボタンを作成するプログラム

  • 受付中

    Labelまとめて

    配列で計算した値をlabelに入れて表示したいのですが、 配列の計算結果を[1][2]...といれていて、同じ数字のlabelに入れたいのですが どうすればよいでしょうか。

  • 解決済

    C# ラベル 特定の文字になったら背景色を変える

    C#初心者です。 labelに入力された文字を解析?して、フォームの背景色を変える方法がわかりません。 (labelに「1」と入力されたら背景色を青に変える labelに「2」と入

同じタグがついた質問を見る

  • C#

    6568questions

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

  • Visual Studio

    1699questions

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

  • .NET Framework

    425questions

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