0

在编写用于 Sharepoint 2007 / WSS 3.0 的自定义 Web 部件时,我遇到了一个奇怪的问题 -当我的 Web 部件上的按钮被单击时,事件处理程序没有触发

按照 MSDN 建议、Sharepoint Services 3.0 内部以及 stackoverflow 的答案,我已经覆盖了System.Web.UI.WebControls.WebParts.WebPart的CreateChildControls()方法。

该方法如下所示:

protected override void CreateChildControls()
{

    // Get the ID from the master (pseudocode here to keep it short)
    if(ICrediteurIdProviderReference == null)
    {
        // We must have the detail-id or we can't load the form
        return;
    }

    // Call base
    base.CreateChildControls();

    // ** Creation of the rest of the form removed for clarity **

    // Create button
    Button saveButton = new Button();
    saveButton.ID = "SaveButton";
    saveButton.Text = "Save";
    // saveButton.CommandName = "Save";
    // saveButton.CommandArgument = "";

    // Register event handler
    saveButton.Click += new EventHandler(saveButton_Click);

    // Add button to page
    this.Controls.Add(saveButton);

}

为了清楚起见,我删除了表单其余部分的启动,以及放置表单的 HTML 表的创建。

我的事件处理程序如下所示:

void saveButton_Click(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine("saveButton_Click fired..");
}

是的,这是我默认的“简单调试”事件处理程序。

到目前为止,我已经尝试遵循这些建议,但没有运气:

  • 在按钮上设置CommandNameCommandArgument(参见注释掉的代码)
  • 在OnInit()方法中而不是在CreateChildControls()中创建按钮

开始扯掉我的头发,但我认为这是我错过的非常简单的事情。任何帮助将不胜感激 :) :)

4

2 回答 2

1

感谢评论更正:)

看起来CreateChildControls被调用了两次。第一次是在绑定提供者值之前。第二次是在绑定之后。

要触发事件,必须在第一次调用CreateChildControls时添加控件。必须在调用第二个调用CreateChildControls时将状态加载到控件中(即,一旦我们通过ICrediteurIdProviderReference从主设备获得记录 ID )。

我的新 CreateClientControls() 如下所示:

protected override void CreateChildControls()
{

    if (controlsLoaded == false)
    {
        LoadControls();
    }

    if (myProviderInterface != null)
    {
        LoadState(myProviderInterface.CrediteurId);
    }

}

controlsLoaded是一个本地布尔值,当LoadControls()完成时设置为true 。

奇怪的是如何正确地写出你的问题然后读回来实际上可以帮助你解决它:)

于 2009-12-23T14:02:14.027 回答
0

您的解决方案看起来像是一种解决方法。CreateChildControls 是可覆盖的,这是有原因的。它允许您在 ASP.NET 控件树构建/页面生命周期的正确时刻添加自己的控件。应该不需要在 Init 事件处理程序中调用 CreateChildCONtrols。

控件事件未触发的可能原因是 WebPart 未“实现” INamingContainer接口。我把 implement 放在引号之间,因为它实际上没有任何方法等要实现,它纯粹是一个所谓的“标记”接口。当控件实现此接口时,ASP.NET 引擎将此控件和其中的任何控件标记为能够生成回发,即它为控件提供“页面控件层次结构中的唯一 id 命名空间”,从而能够跟踪回发事件从该控件生成。

于 2009-12-23T18:25:53.990 回答