代码之家  ›  专栏  ›  技术社区  ›  Ryan Barrett

SharePoint 2007-按钮onclick事件未激发

  •  0
  • Ryan Barrett  · 技术社区  · 15 年前

    在编写用于SharePoint2007/WSS3.0的自定义Web部件时,我遇到了一个奇怪的问题- 单击Web部件上的按钮时,事件处理程序不会触发 .

    遵循建议的MSDN, 在SharePoint Services 3.0中 当然,stackoverflow的答案,我已经覆盖了 创建子控件() 方法 system.web.ui.webcontrols.webparts.web部件 .

    方法如下:

    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..");
    }
    

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

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

    • 设置 命令标识符 命令命令 按钮上(见注释代码)
    • 在中创建按钮 ONIN() 方法而不是In 创建子控件()

    开始扯我的头发,但我想这是我错过的一件很简单的事情。如有任何帮助,我们将不胜感激:)

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ryan Barrett    15 年前

    感谢评论更正:)

    看起来像 创建子控件 两次呼叫。第一次是在绑定提供程序值之前。第二次是在绑定之后。

    对于要触发的事件,必须在第一次添加控件 创建子控件 被称为。状态必须加载到控件的第二层 创建子控件 被调用(即,一旦我们通过 ICrediteurID提供引用 )

    我的新createClientControls()如下所示:

    protected override void CreateChildControls()
    {
    
        if (controlsLoaded == false)
        {
            LoadControls();
        }
    
        if (myProviderInterface != null)
        {
            LoadState(myProviderInterface.CrediteurId);
        }
    
    }
    

    控制加载 是本地布尔值,设置为 什么时候? 加载控件() 已完成。

    奇怪的是,把你的问题写出来,然后再把它读回来,实际上能帮助你解决它。)

        2
  •  0
  •   Colin    15 年前

    您的解决方案看起来像一个解决方案。出于某种原因,CreateChildControls是可重写的。它允许您在ASP.NET控件树构建/页面生命周期的正确时刻添加自己的控件。不需要在init事件处理程序中调用createChildControls。

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

    推荐文章