|
分類:[C#]
■No7697に返信(まどかさんの記事) > #スコープとかまだ不安、誰か添削して。
同じ TabIndex があった場合の対処は置いとくとして……
> = new SortedList< int32,Control> (); で、微妙にスペルミスしている点とか、かな。
■No7698に返信(自分の記事) > [フォーム] > ┣[panel1] … TabIndex=2 > ┃┣[textBox1] … TabIndex=2 > ┃┗[textBox2] … TabIndex=0 > ┣[panel2] … TabIndex=3 > ┃┣[textBox3] … TabIndex=1 > ┃┗[textBox4] … TabIndex=3 > ┣[textBox5] … TabIndex=1 > ┗[textBox6] … TabIndex=0
上記のパターンで、 textBox6, textBox5, textBox2, textBox1, textBox3, textBox4 の順になるようにしてみました。あんまりテストしてませんけど。(汗
/**** C# 2.0 で書いたので、.NET 1.x では動きません。****/
private void Form1_Load(object sender, EventArgs e) { TextBoxBase[] textBoxes = GetAllControls<TextBoxBase>(this);
//チェック用 foreach (TextBoxBase textBox in textBoxes) { Trace.WriteLine(String.Format("TabIndex={0} - Name=\"{1}\"", textBox.TabIndex, textBox.Name)); } }
//すべての子孫コントロールを列挙して、TabIndex順に返す。 private Control[] GetAllControls(Control parentControl) { if (parentControl == null) { throw new ArgumentNullException(); }
//順序無視で追加(子コントロールは含めない)。 List<Control> controls = new List<Control>(); foreach (Control control in parentControl.Controls) { controls.Add(control); }
//TabIndex順にソートする。 controls.Sort(delegate(Control x, Control y) { return x.TabIndex - y.TabIndex; });
//再帰して、子コントロールを挿入する。 for (int i = controls.Count - 1; i >= 0; i--) { Control container = controls[i]; if (container.HasChildren) { controls.InsertRange(i, GetAllControls(container)); } } return controls.ToArray(); }
//コントロールの配列を、コントロールの型でフィルタする。 public T[] GetAllControls<T>(Control parentControl) where T : Control { List<Control> controls = new List<Control>(GetAllControls(parentControl)); List<Control> filtered = controls.FindAll(delegate(Control c) { return c is T; }); return Array.ConvertAll<Control, T>(filtered.ToArray(), delegate(Control value) { return value as T; }); }
|