我的代码隐藏中有这个代码:
for (int i = 0; i < linkList.Count; i++)
{
var link = UppercaseFirst(linkList[i]);
var linkButton = new LinkButton
{
Text = link + " > ",
ID = Convert.ToString(i),
CommandArgument = urlList[i]
};
linkButton.Command += new CommandEventHandler(lnkWeb_Click);
bcHolder.Controls.Add(linkButton);
}
这里是lnkWeb_Click方法:
protected void lnkWeb_Click(object sender, CommandEventArgs e)
{
var url = e.CommandArgument.ToString();
//code...
}
单击其中一个生成的链接按钮时,不会触发此方法。
任何人都知道问题是什么?
在aspx文件中尝试了OnCommand="lnkWeb_Click"
并且方法被触发,但不是我通过代码生成的那些。他们甚至没有OnCommand="lnkWeb_Click"
属性。
答案 0 :(得分:1)
这里的问题在于控制生命周期。如果您想正确处理某些控件的事件 - 您必须在每个页面加载过程中将此控件添加到页面,即每次回发。
看看你的情况会发生什么:
要解决此问题,您可能需要在View State中存储有关必须添加的链接按钮的信息(请不要存储控件本身,这将是一个巨大的开销)。还要注意他们的ID - 对于相同的控件,它们必须相同。
更新。有关View State解决方案的更多提示。
基本上你需要一些指标,在页面加载过程中你需要创建一些动态链接按钮。最基本的方法是存储链接按钮标识符(或文本或两者)的列表,然后在Page_Load
期间检查视图状态中是否存在任何内容。例如:
// Property to access the view state data
protected List<string> Links
{
get { return ViewState['links']; }
set { ViewState['links'] = value; }
}
...
protected void Page_Load(object sender, EventArgs e)
{
...
if (this.Links != null && this.Links.Count > 0)
{
// inside this method you create your link buttons and add them to the page
// you actually have this code already
RenderLinkButtons();
}
}
...
// Not sure about what name you have here
protected void InitialButtonHandlerName(object sender, EventArgs e)
{
List<string> linkList = ...; //your variable, guessing a type
// this is exactly the method you use already to add links to the page
// just one more action added to it - store info about these links into View State to use it on later post backs
this.Links = linkList;
RenderLinkButtons();
}
请在正确的方向上使用它 - 根据您的要求和偏好,您可能会有不同的实施方式。但我希望现在的概念很清楚。