Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET-将事件处理程序添加到RenderContent调用中继器内部的LinkButton_C#_Asp.net_Sharepoint_Web Parts - Fatal编程技术网

C# ASP.NET-将事件处理程序添加到RenderContent调用中继器内部的LinkButton

C# ASP.NET-将事件处理程序添加到RenderContent调用中继器内部的LinkButton,c#,asp.net,sharepoint,web-parts,C#,Asp.net,Sharepoint,Web Parts,我有一个Sharepoint Web部件,用于加载自定义用户控件。用户控件包含一个转发器,转发器又包含几个链接按钮 在Web部件中的RenderContent调用中,我有一些代码可以添加事件处理程序: ArrayList nextPages = new ArrayList(); //populate nextPages .... AfterPageRepeater.DataSource = nextPages; AfterPageR

我有一个Sharepoint Web部件,用于加载自定义用户控件。用户控件包含一个转发器,转发器又包含几个链接按钮

在Web部件中的RenderContent调用中,我有一些代码可以添加事件处理程序:

        ArrayList nextPages = new ArrayList();
        //populate nextPages ....
        AfterPageRepeater.DataSource = nextPages;
        AfterPageRepeater.DataBind();

        foreach (Control oRepeaterControl in AfterPageRepeater.Controls)
        {
            if (oRepeaterControl is RepeaterItem)
            {
                if (oRepeaterControl.HasControls())
                {
                    foreach (Control oControl in oRepeaterControl.Controls)
                    {
                        if (oControl is LinkButton)
                        {
                            ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click);
                        }
                    }
                }
            }
        }
但是,从未调用函数PageNavigateButton_Click。但是,我可以看到它被添加为调试器中的事件处理程序


有什么想法吗?我不知道该怎么做

您需要确保在触发事件之前,将链接按钮重新添加到控件树和/或将事件重新连接到控件


我从未做过SharePoint Web部件,所以我不知道这是否适用。但如果它是一个普通的老apsx页面,我会说,当它呈现的时候,已经太晚了。尝试在控件的Init或PreInit事件中添加事件处理程序


编辑:等等,我想迪利奥可能是对的。请参见本章末尾的“将按钮控件添加到中继器”部分。它在VB.NET中,但在C中也可以轻松地执行相同的操作。

在迭代过程中,是否尝试为每个按钮分配CommandName和CommandArgument属性?Repeater控件支持ItemCommand事件,该事件将在命中具有CommandName属性的控件时引发


由于CommandName和CommandArgument值被传递到事件中,并且易于访问,因此处理起来非常简单。

调用RenderContent时,框架已经调用了所有注册的事件处理程序。您需要在早期方法中添加事件处理程序,如OnLoad:

protected override void OnLoad(EventArge e)
 { base.OnLoad(e);
   EnsureChildControls();

   var linkButtons = from c in AfterPageRepeater.Controls
                                                .OfType<RepeaterItem>()
                     where c.HasControls()
                     select c into ris
                        from lb in ris.OfType<LinkButton>()
                        select lb;

   foreach(var linkButton in linkButtons)
    { linkButton.Click += PageNavigateButton_Click
    }                          
 }

正如其他人指出的,在页面生命周期中添加事件处理程序太晚了。对于SharePoint Web部件,您通常希望重写类“OnInit/CreateChildControls”方法来处理活动。

您需要您的Web部件来实现标记接口,框架使用它来允许回发返回到正确的控件。。。
此外,Web部件中的控件都需要有ID。

我已经尝试将在CreateChildControls方法中添加事件处理程序的代码放到现在可用的位置。谢谢在阅读了别人的建议后,我对代码做了一些修改。我现在试图在CreateChildControls函数中添加事件处理程序,但它们仍然没有被激发。感谢到目前为止所有的帮助,感谢那些在游戏后期看到这些的人。不要使用CreateChildControls。。。这在循环中仍然太晚了。而是重写OnInit处理程序以构建所有动态控件。