为什么我的Linkbuttons命令功能没有被触发
本文关键字:功能 我的 Linkbuttons 命令 为什么 | 更新日期: 2023-09-27 17:53:16
在我的codebehind中有这段代码:
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"
属性
这里的问题在于控件生命周期。如果你想正确地处理某些控件的事件-你必须在每个页面加载过程中,也就是每次回发时,将该控件添加到页面中。
看看你的情况:
- 初始按钮被点击
- 在post back期间,动态链接按钮被添加到页面中,事件处理程序被分配给它们
- 用户点击新生成的链接按钮 在post back期间,这些动态链接按钮不会再次添加到页面中。. NET不知道事件的起源,所以它不调用处理程序。
要解决这个问题,您可能需要在viewstate中存储有关必须添加的链接按钮的信息(请不要存储控件本身,这将是一个巨大的开销)。还要注意它们的id——对于相同的控件,它们必须是相同的。
更新。关于视图状态解决方案的更多提示。
基本上你需要一些指标,在页面加载期间,你需要创建一些动态链接按钮。最基本的方法是存储链接按钮标识符(或文本,或两者)的列表,然后在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();
}
请在正确的方向上使用它-根据您的需求和偏好,您可能会有不同的实现。但我希望现在概念清楚了。