0

私は他の誰かによって作成された VB Windows プログラムを持っています。それは、クラス ライブラリを使用して誰でもプログラムの機能に追加できるようにプログラムされており、プログラムはそれらを呼び出します (つまり、クラス ライブラリ、DLL ファイル) プラグイン、私が作成しているプラ​​グインは C# クラス ライブラリです。つまり..dll

Im が取り組んでいるこの特定のプラグインは、シンプルな DateTime クロック関数をラベルの形で追加し、それを深さ 3 のパネルに挿入します。私が持っているコードをテストしましたが、動作します。私の質問はこれです:それを行うためのより良い方法はありますか? たとえば、Controls.Find を 3 回使用します。そのたびに、探している Panel がわかり、Control[] 配列に追加される Panel が 1 つだけになります。繰り返しますが、1 つの要素を 3 回だけ保持する配列に対して foreach を実行しています。

先ほど言ったように、コードは機能し、期待どおりに機能します。冗長すぎるように思えますが、パフォーマンスの問題があるのではないかと考えています。

コードは次のとおりです。

    foreach (Control p0 in mDesigner.Controls)
        if (p0.Name == "Panel1")
        {
            Control panel1 = (Control)p0;
            Control[] controls = panel1.Controls.Find("Panel2", true);

            foreach (Control p1 in controls)
            if (p1.Name == "Panel2")
            {
                Control panel2 = (Control)p1;
                Control[] controls1 = panel2.Controls.Find("Panel3", true);
                foreach(Control p2 in controls1)
                    if (p2.Name == "Panel3")
                    {
                        Control panel3 = (Control)p2;
                        panel3.Controls.Add(clock);
                    }
             }
         }
4

2 に答える 2

0

次の機能を使用します

   public static Control FindControlRecursive(Control control, string id)
    {
        if (control == null) return null;
        Control ctrl = control.FindControl(id);
        if (ctrl == null)
        {
            foreach (Control child in control.Controls)
            {
                ctrl = FindControlRecursive(child, id);
                if (ctrl != null) break;
            }
        }
        return ctrl;
    }
}

その後

Control panel3 = FindControlRecursive(mDesigner.Controls, "Panel3");
于 2012-09-30T02:57:29.627 に答える
0

Andrei が共有するコンセプトを使用して、Panel に追加したい Label だけで機能するだけでなく、2 つのラベルのサイズと位置を単純に変更する別のメソッドから呼び出すこともできるメソッドを作成することができました。他のコントロール、この機能を非常に再利用可能にします。

private Control FindControlRecursive(Control ct, string id)
{
    Control[] c;
    Control ctr;

    if (ct == null)
        c = mDesigner.Controls.Find(id, true);
    else
        c = ct.Controls.Find(id, true);

    foreach (Control child in c)
    {
        if (child.Name == id)
        {
            ctr = child;
            return ctr;
        }
        else
        {
            ctr = FindControlRecursive(child, id);
            if (ctr != null)
                return ctr;
        }
    }
    return null;
}

呼び出しコードは次のようになります。

Control ct = null;
Control panel3 = FindControlRecursive(ct, "Panel3");

// and Here is where I can Add controls or even change control properties.
if (panel3 != null)
    panel3.Controls.Add(clock);

助けてくれてありがとう...

于 2012-09-30T06:34:10.913 に答える