为什么我的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"属性

为什么我的Linkbuttons命令功能没有被触发

这里的问题在于控件生命周期。如果你想正确地处理某些控件的事件-你必须在每个页面加载过程中,也就是每次回发时,将该控件添加到页面中。

看看你的情况:

  1. 初始按钮被点击
  2. 在post back期间,动态链接按钮被添加到页面中,事件处理程序被分配给它们
  3. 用户点击新生成的链接按钮
  4. 在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();    
}

请在正确的方向上使用它-根据您的需求和偏好,您可能会有不同的实现。但我希望现在概念清楚了。