C# ユーザーコントロールを利用してテキストボックスの中身もコピーしたい

はじめに

業務で、C#のフォームアプリで
ユーザーコントロールを使ってタブページを追加するときに

タブページの中にあるテキストボックスに記入されているテキストもコピーしてほしい

という要望がありました。

テキストボックスの中身(書かれている文字列)までコピーするのが、個人的に難関でした。
勝手ながら、この場を借りて共有したく存じます。

Visual Studioで作ってみた

Visual Studioで

C#のフォームアプリケーションを新規作成します。

新規作成したら、プロジェクトのところを右クリックし、追加を選択すると

ユーザーコントロールという項目があるので

それをクリックします。

以下の画面に遷移しますので、名前をつけましょう。

(キャプチャの都合上、「あ」が入ってしまいました。お気になさらないでください。)

ユーザーコントロールができました(パチパチパチパチ)

そして、できたユーザーコントロールに

載せたいものをじゃんじゃん載せていきましょう(今回は2つだけですが……。)

メインのフォームにタブページと、コピーのイベントを走らせるためのボタンを配置し、

メインフォームのソースコードには

using System;
using System.Drawing;
using System.Windows.Forms;

namespace 発表用
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

   

   private void Form1_Load(object sender, EventArgs e)
        {
            DemoUC uc = new DemoUC();

            tabPage1.Controls.Add(uc);  //タブページにユーザーコントロールを載せる
        }

  }

と記載し、起動してみます。

続いて、本題の

テキストボックスの中身もコピーに

取り掛かっていきます。


using System;
using System.Drawing;
using System.Windows.Forms;

namespace 発表用
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

   

   private void Form1_Load(object sender, EventArgs e)
        {
            DemoUC uc = new DemoUC();   //ここより上のスコープで宣言すると、追加するたびにユーザーコントロールが移動します

            tabPage1.Controls.Add(uc);
        }

 

        private void CopyButton_Click(object sender, EventArgs e)
        {
            //タブページの見出しを決める
            string name = (tabControl.TabPages.Count + 1).ToString();

            TabPage tbp = new TabPage(name);


            //タブページを増やす
            tabControl.TabPages.Add(tbp);   //これでタブページそのものは増えます
            tbp.Name = name;                //タブページを後で探せるようにNameプロパティを付与します
            tbp.BackColor = Color.White;    //デフォルトだと、色が濃い灰色なので白に指定します
           
            DemoUC uc = new DemoUC();       //ここより上のスコープで宣言すると、追加するたびにユーザーコントロールが複製されないで移動してしまいます

            tbp.Controls.Add(uc);           //新しくできたタブページにユーザーコントロールを乗せる

 

            //コピー元のテキストボックスのテキストを取得します
            //先ずはコピー元のテキストボックスを検索します
            Control[] _tb1 = tabControl.SelectedTab.Controls.Find("textBox1", true);
            Control[] _tb2 = tabControl.SelectedTab.Controls.Find("textBox2", true);

 

            //テキストボックスにキャストします
            TextBox tb1 = (TextBox)_tb1[0];
            TextBox tb2 = (TextBox)_tb2[0];

 

            //新しく作ったタブページを取得します
            //スマートなやり方が分からなかったので、SelectedTabを新しく作ったタブに無理やり変えてしまう方法をとっています
            tabControl.SelectedTab = tabControl.TabPages[name];

 

            //コピー先のテキストボックスを検索します
            Control[] _newTb1 = tabControl.SelectedTab.Controls.Find("textBox1", true);
            Control[] _newTb2 = tabControl.SelectedTab.Controls.Find("textBox2", true);

 

            //テキストボックスにキャストします
            TextBox newTb1 = (TextBox)_newTb1[0];
            TextBox newTb2 = (TextBox)_newTb2[0];

 

            //テキストボックスに予め保存していたテキストを代入します

            newTb1.Text = tb1.Text;
            newTb2.Text = tb2.Text;

        }     

    }
}


Nameプロパティを使って、コピー先となるテキストボックスを検索し、それをテキストボックスにキャストし、渡せるようにする

という手法を取っています。

 

また、タブページの選択に関して

新しく作ったタブページに、テキストを渡す

また、今後の改修等で、新しく作ったタブページが一番後ろにあるとも限らない可能性もある

ということで

SelectedTabを新しく作ったタブページに無理矢理変えさせるという荒業を使ってしまいました。

もっと、スマートに見えるやり方があればご教示くださいorz

 

何はともあれ……。

右上のコピーボタンを押します。

コピーできました……!!

ちなみに、複数回押してみても……。

できた…泥臭さが否めないですが、望み通りの動作はできました…よかった…(感涙)

 

もっと、いい方法があるような気がします(コードレビュー時、ここは何も言われてないです())。

手掛かりをご存じの方はご一報くださいorz