方法是循环,而不是在winform应用程序中的循环中调用

时间:2013-11-26 06:38:35

标签: c# .net winforms

我有一个Windows窗体应用程序,其中有一个方法可以在面板上动态创建控件,但不知道如何在不调用循环的情况下反复调用该方法,这会导致每次都重新创建面板上的控件面板像坚果一样闪烁

我无法找到任何帮助将受到高度赞赏的原因

以下是加载默认控件的代码

internal void LoadDefaultControl()
{

        switch ((ProductType)_tillContext.Till.DefaultProductType)
        {
            case ProductType.Gift_Voucher:
                LoadGiftVouchersControl();

                break;
            case ProductType.Merchandise:
                LoadMerchandiseControl();
                break;
            case ProductType.Service:
                LoadServicesControl();
                break;
            default:
                LoadAdmissionsControl();
                break;
        }

}

下面的方法是调用上面的方法

private void RenewMembership(Domain.Members.Member member, MembershipAdmissionValidityHelper.MembershipAdmissionValidity validity)
    {
        var wizard =
            new PurchaseWizard(control => new MembershipRenewalProcessController(member, validity,
                                            new MembershipRenewalInteractionController(control, _tillContext),
                                        _tillContext))
            {
                Size = pnlWorkArea.Size
            };

        wizard.OnCancelled += LoadDefaultControl;
        wizard.OnPurchaseCreated += purchase =>
        {
            AddItemToBasket(purchase);
            LoadDefaultControl();
        };

        ClearControls();
        pnlWorkArea.Controls.Add(wizard);
    }

1 个答案:

答案 0 :(得分:0)

即使你在wizard内声明RenewMembership,它有一个订阅OnCancelled事件的处理程序,这意味着它永远不会被垃圾收集。

只创建一次向导,然后添加事件处理程序或添加以下行以删除处理程序:

wizard.OnCancelled -= LoadDefaultControl;

现在需要在事件触发后完成,因此最好在事件处理程序本身中完成。这意味着您需要某种方式将对wizard的引用传递给处理程序。

鉴于这可能会很快变得混乱,因此将wizard作为类的私有属性并且只创建一次并且只添加一次处理程序可能更简单。