先週、C#ソフトのタブインデックスを久しぶりに自分で設定しました。
いつもは誰かにして貰っていたのですが、自分でするとものすごく面倒くさい。
これは人のする作業ではないと考え、自動化する方法を検討。
結果、ネットの情報を元に以下の拡張メソッドを作成しました。
public static void RefreshTabIndex(this Control ctl) {
//子コントロールのタブインデックス更新
foreach (Control child in ctl.Controls) {
if (child.Controls.Count <= 0) continue;
child.RefreshTabIndex();
}
//子コントロールの位置をもとにソートする
var children = new List<Control>();
foreach (Control child in ctl.Controls) {
children.Add(child);
}
children.Sort((x, y) => {
if (x.Top == y.Top) return x.Left.CompareTo(y.Left);
return x.Top.CompareTo(y.Top);
});
//タブインデックスを設定する
for (int i = 0; i < children.Count; i++) {
if (children[i].TabIndex == i) continue;
children[i].TabIndex = i;
}
}
フォームのコンストラクタなどで、this.RefreshTabIndex()を実行すると、
コントロールの配置をもとに自動でタブインデックスが設定されます。
まだ使い始めた所なので、この方法ではうまくいかない場合があるかも知れませんが。
概ね思っている動作をしており、作業が楽になりました。