1

Form または UserControl のコンポーネント コレクションの一部であるすべてのコンポーネントを取得したいと考えています。コンポーネント コレクションは、VS winforms デザイナーによって追加されます。components 変数はプライベートであり、問​​題はすべての子孫からすべてのコンポーネントを取得する方法です。タイプ階層を介してコンポーネントのリストを返すメソッドが必要です。たとえば、MyForm (BaseForm の子孫) と BaseForm (Form の子孫) があるとします。MyForm と BaseForm の両方のコンポーネントを返すメソッド「GetComponents」を配置したいと思います。

リフレクションを使用する以外のオプションはありますか?

4

1 に答える 1

3

少し前に、カスタム ベース フォームとコントロールの実装を作成し、1 つのプロパティを追加して OnLoad メソッドをオーバーライドするソリューションを実装しました。

public partial class FormBase : Form   
{
    public FormBase ()
    {
        this.InitializeComponent();
    }

    protected ConsistencyManager ConsistencyManager { get; private set; }

    protected override void OnLoad(System.EventArgs e)
    {
        base.OnLoad(e);

        if (this.ConsistencyManager == null)
        {
            this.ConsistencyManager = new ConsistencyManager(this);
            this.ConsistencyManager.MakeConsistent();
        }
    }
}

ConsistencyManager クラスは、すべてのコントロール、コンポーネントを検索し、特定のコントロール内のカスタム子コントロールの検索もサポートします。MakeConsistent メソッドからのコードのコピー/貼り付け:

    public void MakeConsistent()
    {
        if (this.components == null)
        {
            List<IComponent> additionalComponents = new List<IComponent>();

            // get all controls, including the current one 
            this.components =
                this.GetAllControls(this.parentControl)
                .Concat(GetAllComponents(this.parentControl))
                .Concat(new Control[] { this.parentControl });

            // now find additional components, which are not present neither in Controls collection nor in components
            foreach (var component in this.components)
            {
                IAdditionalComponentsProvider provider = GetAdditinalComponentsProvider(component.GetType().FullName);

                if (provider != null)
                {
                    additionalComponents.AddRange(provider.GetChildComponents(component));
                }
            }

            if (additionalComponents.Count > 0)
            {
                this.components = this.components.Concat(additionalComponents);
            }
        }

        this.MakeConsistent(this.components);
    }

完全なサンプルまたはソースが必要な場合は、お知らせください。

よろしく、 ズヴォンコ

PS: 同様に、メイン スレッドでの呼び出し回数をカウントするパフォーマンス カウンターも作成しました。

于 2012-12-28T08:21:09.507 に答える