每当 DropDownList SelectedIndexChanged 时,我都会在代码隐藏中添加 LinkButton 作为 ul-li 列表。每个链接按钮都分配有 ID 和一个公共 Click 事件。问题是 Click 事件中的代码未执行,或者事件未触发。我在下面的代码:[编辑]我按照其他帖子中的建议尝试了这样做(动态创建的链接按钮列表,链接按钮未回发(
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();
}
我错过了一些东西。请帮忙。
这里的问题出在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;
}
}
以下是我对DropDownList
SelectedIndexChanged
Event
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 />"));
}
这是LinkButton
Click event
void linkbutton_Click(object sender, EventArgs e)
{
//You logic here
}
我用蛮力代码解决了它,哈哈。 由于控件的事件在回发时未绑定,因此我们在回发时重新创建它们。因此,在我的Page_Load中,我调用了重新创建控件的模块,从而将它们绑定到相应的事件。这行得通,但是...
重新创建这些控件会创建重复项 (Multiple Controls with same ID were found
(,在按 ID 查找控件(如使用panel.FindControl
(的情况下,您将遇到麻烦。 为了纠正这种情况,我在重新创建它们之前检查了相同的控件 ID 是否已存在,瞧!它有效。
protected void Page_Load(object sender, EventArgs 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);
if (liList.FindControl(dr["col1"].ToString()) == null)
{
var lnk = new LinkButton();
lnk.ID = dr["col1"].ToString();
lnk.Text = dr["col1"].ToString();
lnk.Click += Clicked;
liList.Controls.Add(lnk);
}
}
}