- PR -

文字列によるコントロール操作

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-11 16:57
引用:

にゃんぎさんの書き込み (2004-05-11 16:07) より:
ControlCollectionについて調べてみました。

INDEXを使ってコントロールの指定はできました。
あとは文字列でコントロールの指定ができれば解決しそうです。


 MSDNを引くのが面倒なので「同じだろう」と思ったら、違ったみたいですね。すみません。

 たとえば、Formの上にPanelを置いて、その上にTextBoxを置いたとします。すると、Form.ControlsにTextBoxはなく、Form.Controls(Panel).Controls(TextBox)の様なところを探さなければなりません。

 その為、Formクラスのメソッドとして、Controlsの階層をたどる様なものを用意するとよいでしょう。

直書き未検証
コード:

System.Windows.Forms.Control
FindControl(String ControlName, Cntrol BaseControl) {
Control cntrl;
System.Collections.Stack stk = new System.Collections.Stack();

stk.Push(BaseControl);
while (stk.Count > 0) {
cntrl = (Control) stk.Pop();
if (ControlName.CompareTo(cntrl.Name) == 0) {
return cntrl;
}
for (int cnt = 0; cnt < cntrl.Controls.Count; cnt++) {
// ここでControlsを持っているヤツだけスタックに入れたり、
// 名前の一致を検証すると、高速化が図れるかも
stk.Push(cntrl.Controls[cnt]);
}
}
return null;
}


スタックに入れずに再帰してもいいのだけれど、なんとなく。。。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-05-11 17:00 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-05-11 17:08
Control#Nameプロパティにあらかじめ検索名をセットしておき、そのうえで、
コード:

private Control FindControlByName(string inName, Control inParent) {
foreach (Control aControl in inParent.Controls) {
if (aControl.Name.Equals(inName)) {
return aControl;
}
aControl = FindControlByName(inName, aControl);
if (null != aControl) return aControl;
}

return null;
}


として、取り出してはいかがでしょう。

# Jittaさんの回答よりは、速くないだろうなぁ...きっと

# 追加
# やば。再帰にしてなかった....

[ メッセージ編集済み 編集者: かずくん 編集日時 2004-05-11 17:12 ]
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2004-05-11 17:48
Jitta様、かずくん様 ありがとうございます。

まるまるコピーするのではなくて2パターン両方とも試してみます。
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2004-05-11 20:34
お世話になります。

早速やってみました(といっても解析にすごい時間が・・)
そして、無事動きました。期待通りの動作をしています。

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

スキルアップ/キャリアアップ(JOB@IT)