每当DropDownList SelectedIndexChanged,我在链接后面添加LinkButtons作为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();
}
我错过了什么。请帮忙。
答案 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