私は親コントロールのすべての子を取得するコード例を探しています。親コントロールのすべての子を取得するには?
どうすればいいのかわかりません。
foreach (Control control in Controls)
{
if (control.HasChildren)
{
??
}
}
私は親コントロールのすべての子を取得するコード例を探しています。親コントロールのすべての子を取得するには?
どうすればいいのかわかりません。
foreach (Control control in Controls)
{
if (control.HasChildren)
{
??
}
}
次に、次のような形式で使用してください:
private void button1_Click(object sender, EventArgs e)
{
/// get all of the controls in the form's hierarchy in a List<>
var controlList = GetControlHierarchy(this).ToList();
foreach (var control in controlList)
{
/// do something with this control
}
}
はすぐにEnumerable全体を評価するので、コルーチンの実装から得られる効果がなくなります。
コントロールを使用すると、上foreach
を行うことができますMyControl.Controls
コレクションを持っています。
各コントロールには、親コントロールを提供するParent
プロパティもあります。
未知数のレベルを下げる必要がある場合は、再帰的な方法を記述できます。
private IEnumerable<Control> GetControlHierarchy(Control root)
{
var queue = new Queue<Control>();
queue.Enqueue(root);
do
{
var control = queue.Dequeue();
yield return control;
foreach (var child in control.Controls.OfType<Control>())
queue.Enqueue(child);
} while (queue.Count > 0);
}
:あなたが唯一の直接の子にしたい場合は、階層(すなわち、特定の制御下にあるツリー内のすべてのもの)、使用からすべてのコントロールをしたい場合は、
...
var children = control.Controls.OfType<Control>();
...
を使用
多分それは誰かのために役に立つかもしれません:
public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter)
{
foreach (Control child in root.Controls)
{
var childFiltered = filter(child);
if (childFiltered != null) AllControls.Add(child);
if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter);
}
}
これは(種類別expample用)フィルタをアプリングの可能性とコントロールのコレクションを取得するための再帰関数です。そして例:
List<Control> resultControlList = new List<Control>();
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null));
は、それはおそらく過度に複雑rootControlと彼のすべての子供たちに
をすべてDropDownListsを返しますが、/他の場所上からのLINQといくつかのアイデアを使用します:
public static IEnumerable<Control> GetAllChildren(this Control root) {
var q = new Queue<Control>(root.Controls.Cast<Control>());
while (q.Any()) {
var next = q.Dequeue();
next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue);
yield return next;
}
}
ご質問はっきりしていない。これらのコントロールをどのようにして取得したいのですか?既にそれらのコントロールを反復する方法をどのように知っているかを見ていますか? –
foreachループを使用して、子を既に反復しています。少なくともこれの子供たち。コントロール、おそらくフォーム。 「親コントロール」で何を意味するのかが明確ではありません。 –