我有一个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);
}
答案 0 :(得分:0)
即使你在wizard
内声明RenewMembership
,它有一个订阅OnCancelled
事件的处理程序,这意味着它永远不会被垃圾收集。
只创建一次向导,然后添加事件处理程序或添加以下行以删除处理程序:
wizard.OnCancelled -= LoadDefaultControl;
现在需要在事件触发后完成,因此最好在事件处理程序本身中完成。这意味着您需要某种方式将对wizard
的引用传递给处理程序。
鉴于这可能会很快变得混乱,因此将wizard
作为类的私有属性并且只创建一次并且只添加一次处理程序可能更简单。