はじめに
業務で、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