前のページではタブページを追加してRichTextBoxを乗せる方法を考えました。このページでは、 各ページのRichTextBoxにアクセスする方法について考えます。
選択されているタブページに存在するコントロールを検索してRichTextBoxを見つけるという方法もありますが、 作成されたRichTextBoxをListに登録してしまうと簡単にアクセスできるので、その方法を記録しておきたいと思います。
RichTextBoxをListに登録する
複数のファイルを扱う場合、それぞれのタブページにあるエディタ(RichTextBox)には異なったテキストが存在しています(上図)。ということで、現在アクティブなタブのエディタにあるテキストを取得する方法を考えなければなりません。
動的配列にRichTextBoxを登録できれば結構楽にアクセスできます。ということで調べていたのですが、C#ではListを使うと動的配列のように扱えることがわかりました。ちょっと力業になってしまってベストではないと思いますが、とにかく簡単なのでこの方法でいくことにします。
前のページで見たスクリプトに、次の2行を追加します。
int cnt = 1; List<RichTextBox> RTBList = new List<RichTextBox>(); //RichTextBoxのリストRTBListを作成 private void button1_Click(object sender, EventArgs e) { string title = "page" + cnt.ToString(); TabPage newtab = new TabPage() { Name = title, Text = title }; tabControl1.TabPages.Add(newtab); RichTextBox rtb = new RichTextBox() { Name = "RichTextBox" + cnt.ToString(), Dock = DockStyle.Fill }; newtab.Controls.Add(rtb); RTBList.Add(rtb); //新しく作ったRichTextBoxをRTBListに追加する tabControl1.SelectedIndex = tabControl1.TabCount - 1; cnt++; }
これで準備完了です。
RichTextBoxにアクセスする
次に、Listに登録したRichTextBoxにアクセスする方法を考えますが、こちらは簡単です。TabPageとRichTexBoxは同時に作っているので、TabPageのIndexとRichTexBoxを格納したListのIndexは同じです。ですから次のようにすれば、アクティブタブのRichTextBoxにアクセスできます。
private void button2_Click(object sender, EventArgs e)
{
string mes = RTBList[tabControl1.SelectedIndex].Text;
MessageBox.Show(mes);
}
非常にシンプルなコードでRichTexBoxにアクセスできます。
もちろんタブを削除する場合は、List上のRichTextBoxも削除しておきましょう↓そうしないとIndexが揃わないことになります。
RTBList.Remove(RTBList[tabControl1.SelectedIndex]); tabControl1.TabPages.Remove(tabControl1.SelectedTab);
C#の場合、Removeのカッコ内はIndex(数値)ではなく削除するコントロールを指定します。
コントロールを検索する場合
一応Listを使わずコントロールを検索する方法についても掲載しておきます。
string tb = tabControl1.SelectedTab.Name;
string rt = tb.Replace("page", "RichTextBox"); //タブページの名前からRichTextBoxの名前を割り出す
Control[] ctl = this.Controls.Find(rt, true); //該当する名称のコントロールを検索
//取得したコントロールのうち、RichTextBoxを探す
for ( int i = 0 ; i < ctl.Length ; i++ )
{
if (ctl[i] is RichTextBox)
{
RichTextBox bx = ((RichTextBox)ctl[i]); //RichTextBoxに型変換
MessageBox.Show(bx.Text);
break;
}
}
多分もっとスマートな方法があると思うのですが、残念ながら検索してもわかりませんでした。
次のページではサブルーチン化する方法について書いてみます。