繁体   English   中英

ASP.NET-复合控件-在CreateChildControls抑制Button Click事件后添加动态控件

[英]ASP.NET - Composite Control - Adding Dynamic Control after CreateChildControls suppresses Button Click event

设置 -我希望用户输入其塑料卡的详细信息。 他们可以单击AddNewCard按钮添加多个卡。

[Serializable]
public class Card
{
    public string Number { get; set; }
    public string Code { get; set; }
}

public class CardControl : CompositeControl
{
    private LinkButton _lnkAddNewCard = new LinkButton { Text = "Add Card" };
    private  PlaceHolder _plcListCards=new PlaceHolder();

    private IList<Card> _lstCards
    {
        get { return (IList<Card>) ViewState["ListCards"]; } 
        set { ViewState["ListCards"] = value; }         
    } 

    protected override void OnInit(EventArgs e)
    {
        _lnkAddNewCard.Click+=_lnkAddNewCard_Click;
    }

    void _lnkAddNewCard_Click(object sender, EventArgs e)
    {
        var lstCards = _lstCards ?? new List<Card>();
        lstCards.Add(new Card());
        _lstCards = lstCards;
        RenderCard(_lstCards[lstCards.Count - 1]);
    }

    protected override void CreateChildControls()
    {
         Controls.Clear();

         Controls.Add(_lnkAddNewCard);

         Controls.Add(_plcListCards);
         RenderCards();
    }

    protected void RenderCards()
    {
        _plcListCards.Controls.Clear();
        if(_lstCards == null) _lstCards = new List<Card> { new Card() };

        foreach (var card in _lstCards)
            RenderCard(card);
    }

    protected void RenderCard(Card card)
    {
        _plcListCards.Controls.Add(new TextBox() { Text = card.Number});

        _plcListCards.Controls.Add(new TextBox() { Text = card.Code});
    }
}

问题

  • 在第一页加载时,将显示用于输入第一张卡片的文本框。
  • 如果用户单击“ 添加新卡” ,则会发生回发并且触发按钮单击事件。
  • 作为回发,CreateChildControls已经执行,因此,按钮单击事件处理程序将调用RenderCard()以便为第二张卡片条目附加文本框。
  • 如果用户再次单击添加新卡 ,则这次不会触发按钮单击。 大为什么?

新卡尚未订阅创建的点击事件。 每次创建新卡时,都需要添加事件处理程序。

var newCard = new Card();
newCard.Click+=_lnkAddNewCard_Click;
_lstCards.Add(new newCard);

你必须打电话

_lnkAddNewCard.Click+=_lnkAddNewCard_Click;

在每个帖子中,因此_lnkAddNewCard_Click将是

void _lnkAddNewCard_Click(object sender, EventArgs e)
{
    _lnkAddNewCard.Click+=_lnkAddNewCard_Click;
    var lstCards = _lstCards ?? new List<Card>();
    lstCards.Add(new Card());
    _lstCards = lstCards;
    RenderCard(_lstCards[lstCards.Count - 1]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM