はじめに
業務で、C#のフォームアプリで
ユーザーコントロールを使ってタブページを追加するときに
タブページの中にあるテキストボックスに記入されているテキストもコピーしてほしい
という要望がありました。
テキストボックスの中身(書かれている文字列)までコピーするのが、個人的に難関でした。
勝手ながら、この場を借りて共有したく存じます。
Visual Studioで作ってみた
Visual Studioで
C#のフォームアプリケーションを新規作成します。
新規作成したら、プロジェクトのところを右クリックし、追加を選択すると
ユーザーコントロールという項目があるので
それをクリックします。
![](https://image.jimcdn.com/app/cms/image/transf/none/path/s9865c8516a7301d3/image/i4458fc4e767760cf/version/1562211470/image.png)
以下の画面に遷移しますので、名前をつけましょう。
(キャプチャの都合上、「あ」が入ってしまいました。お気になさらないでください。)
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/ibe51cf87f5d111e8/version/1562211510/image.png)
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/iadf9560949f22b13/version/1562211712/image.png)
ユーザーコントロールができました(パチパチパチパチ)
そして、できたユーザーコントロールに
載せたいものをじゃんじゃん載せていきましょう(今回は2つだけですが……。)
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/iadec42ecfb4a4c3d/version/1562211771/image.png)
メインのフォームにタブページと、コピーのイベントを走らせるためのボタンを配置し、
メインフォームのソースコードには
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); //タブページにユーザーコントロールを載せる
}
}
と記載し、起動してみます。
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/ifa13662b56edf852/version/1562211850/image.png)
続いて、本題の
テキストボックスの中身もコピーに
取り掛かっていきます。
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
何はともあれ……。
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/ibdf540fd792b4cff/version/1562211912/image.png)
右上のコピーボタンを押します。
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/i40c691df0414efcf/version/1562211931/image.png)
コピーできました……!!
ちなみに、複数回押してみても……。
![](https://image.jimcdn.com/app/cms/image/transf/dimension=681x10000:format=png/path/s9865c8516a7301d3/image/ia18f751e800b0c11/version/1562211959/image.png)
できた…泥臭さが否めないですが、望み通りの動作はできました…よかった…(感涙)
もっと、いい方法があるような気がします(コードレビュー時、ここは何も言われてないです())。
手掛かりをご存じの方はご一報くださいorz