动态创建的链接按钮的常见事件不会触发

时间:2017-07-25 12:21:42

标签: c# asp.net visual-studio-2008

每当DropDownList SelectedIndexChanged,我在链接后面添加LinkBut​​tons作为ul-li列表。每个链接按钮都分配有ID和常见的Click事件。问题是Click事件中的代码未执行或者事件未触发。我的代码如下:[编辑]我按照其他帖子(dynamically created list of link buttons, link buttons not posting back

的建议尝试了这样做
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
   populate();
}

protected override void OnInit(EventArgs e)
{
   base.OnInit(e);
   populate();
}

void populate()
{
   HtmlGenericControl ulList = new HtmlGenericControl("ul");
   panel.Controls.Add(ulList);

   foreach (DataRow dr in drc) 
   {
      HtmlGenericControl liList = new HtmlGenericControl("li");
      ulList.Controls.Add(liList);

      var lnk = new LinkButton();
      lnk.ID = dr["col1"].ToString();
      lnk.Text = dr["col1"].ToString();
      lnk.Click += Clicked;
      liList.Controls.Add(lnk);
   }
}              

private void Clicked(object sender, EventArgs e)
{
   var btn = (LinkButton)sender;
   label1.Text = btn.ID.ToString();
}

我错过了什么。请帮忙。

2 个答案:

答案 0 :(得分:0)

问题在于ViewState。当dropdownlist的所选索引发生更改时,会发生postback并且之前的状态丢失,因此此时您必须保持控件的状态。

现在,在您的代码中,控件的状态实际上已丢失,因此click event不会触发。所以解决方案是保持控件的状态。

以下是一个工作示例,您可以将其粘贴并尝试。

这是我的page load

protected void Page_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < LinkButtonNumber; i++)
                AddLinkButton(i);
        }

同样,你必须保持以前添加的控件的状态。

private int LinkButtonNumber
        {
            get
            {
                var number = ViewState["linkButtonNumber"];
                return (number == null) ? 0 : (int)number;
            }
            set
            {
                ViewState["linkButtonNumber"] = value;
            }
        }

以下是SelectedIndexChanged

Event DropDownList
protected void Example_SelectedIndexChanged(object sender, EventArgs e)
        {
            AddLinkButton(LinkButtonNumber);
            LinkButtonNumber++;
        }

我有一个动态创建控件的函数,在页面加载和SelectedIndexChanged上调用。

private void AddLinkButton(int index)
        {
            LinkButton linkbutton = new LinkButton { ID = string.Concat("txtDomain", index) };
            linkbutton.ClientIDMode = ClientIDMode.Static;
            linkbutton.Text = "Link Button ";
            linkbutton.Click += linkbutton_Click;
            PanelDomain.Controls.Add(linkbutton);
            PanelDomain.Controls.Add(new LiteralControl("<br />"));
        }

这是Click event

LinkButton
void linkbutton_Click(object sender, EventArgs e)
        {
            //You logic here
        }

答案 1 :(得分:0)

我用暴力代码lol解决了它。 由于控制&#39;事件没有绑定回发然后我们在回发上重新创建它们。所以在我的Page_Load中,我调用了重新创建控件的模块,从而将它们绑定到相应的事件。这有效,但......

重新创建这些控件会创建重复项(let news = ''; news.map(el => { console.log(el); })),在使用Multiple Controls with same ID were found等ID查找控件的情况下会遇到麻烦。 为了解决这个问题,我在重新创建之前检查了是否已存在相同的控件ID,瞧!它有效。

panel.FindControl