【问题标题】:asp:button Created Programmatically: EventHandler does not fireasp:button 以编程方式创建:EventHandler 不会触发
【发布时间】:2010-12-18 20:40:31
【问题描述】:

我正在编写一个具有简单 ASP.NET 表单的 SharePoint Web 部件。我正在使用 HtmlTextWriter 来呈现控件。我遇到的问题是我的按钮似乎没有触发我分配的 EventHandler。

我最初在 CreateChildControls 方法中声明了按钮,并连接了事件处理程序:

{
    Button submitButton;
    submitButton = new Button();
    submitButton.Text = "Go!";
    submitButton.Click += new EventHandler(submitButton_Click);
    Controls.Add(submitButton);
}

我已经声明了“submitButton_Click”EventHandler 的功能:

void submitButton_Click(object sender, EventArgs e)
{
    submitButton.Text = "Good!";
}

我渲染控件:

protected override void RenderContents(System.Web.UI.HtmlTextWriter output)
{ 
        RenderChildren(output);
}

最后,我部署了 Web 部件。它在目录中显示得很好,当我将它添加到页面时,控件就会显示出来。但是,我会假设当我单击按钮时,它的文本应该从“开始!” “好!”相反,它什么也不做。我对所有这些技术(C#、Sharepoint 和 ASP.NET)都很陌生,所以我很确定这是我的理解方面的问题,但是尝试从网络上的文章和以前的问题中尝试不同的步骤没有没有解决我的问题。感谢您的观看。

编辑:我打开了带有 Web 部件的 SharePoint 页面,按钮已创建如下:

<input type="submit" name="ctl00$PlaceHolderMain$ctl00$ctl04" value="Go!" />

看起来根本没有添加 OnClick 值,这就是我认为添加 EventHandler 会做的事情。我是否试图以完全错误的方式添加 OnClick?我也不明白为什么按钮名称与我在代码中声明的不匹配。

【问题讨论】:

    标签: c# asp.net sharepoint web-controls htmltextwriter


    【解决方案1】:

    看看这个链接:

    http://msdn.microsoft.com/en-us/library/ms452873.aspx

    您错误地覆盖了 RenderContents 方法,并将点击事件连接到错误的位置。

    【讨论】:

    • 我看到这绝对是我的问题的一部分。我现在在 CreateChildControls 方法中连接 click 事件,并按照教程中的描述渲染控件,方法是在 RenderContents 方法中调用 RenderControls(HtmlTextWriter)。但是,我仍然没有高兴,这让我相信我的 submitButton_Click 方法中的逻辑是问题所在。我是否试图错误地更改按钮的文本属性?
    • submitButton 是你类的属性吗?尝试在 submitButton.Text = "Good!"; 之后添加 this.SaveProperties = True
    • 您要将 Web 部件 DLL 部署到哪里?如果它位于 Web 应用程序的 /bin 目录中,则需要回收应用程序池才能使更改生效。
    • 我尝试使用 SaveProperties 方法,但仍然一无所获。目前,我正在将我的 web 部件部署到 web 应用程序的本地 bin。每次部署时我都会回收应用程序池(实际上,我完全回收了 IIS)。
    • 接下来你可能需要调试它。在 CreateChildControls 方法中放置一个断点,然后查看 EventArgs 值并查看它设置为什么。
    【解决方案2】:

    改用 CreateChildControls 覆盖,它会在 ASP.NET 控件呈现管道中的适当时刻调用。

    【讨论】:

      【解决方案3】:

      您是继承自 System.Web.UI.WebControls.WebParts.WebPart 还是 SharePoint WebPart(抱歉,我不记得命名空间了)。建议从“System.Web.UI.WebControls.WebParts.WebPart”继承,这样它是一个简单的 ASP.NET Web Part,也可以在 SharePoint 中使用。

      一旦您从该类继承,您将需要覆盖“渲染”方法,这是我一直在做的,并且效果很好。我认为您的 CreatechildControls 方法是正确的。所以你的渲染方法看起来像

      protected override void Render(System.Web.UI.HtmlTextWriter output)
      { 
              submitButton.RenderControl(write);
      }
      

      您还需要在“CreateChildControls”方法之外声明您的按钮。在编写 SharePoint WebParts 时,我总是采用这种方法

      1. 从 System.Web.UI.WebControls.WebParts.WebPart 继承
      2. 创建一个分部类,用于声明 WebPart 使用的所有控件并覆盖以下方法:“CreateChildControls”、“OnInit”和“Render”。

      希望对你有帮助。

      【讨论】:

      • 我一直从 System.Web.UI.WebControls.WebParts.WebPart 继承,但我现在从 SharePoint 命名空间继承,因为从 System WebPart 继承时我无法访问 SaveControls命名空间。
      【解决方案4】:

      我遇到了类似的问题。事件处理程序总是在触发。我检查了 SharePoint 页面的视图源,发现呈现的 HTML 控件是输入类型 = 提交。为了解决这个问题,我在代码中设置了 'button.UseSubmitBehavior = false' 并设置了 ID。如果未在代码中设置,ASP.NET 2.0 中的 UseSubmitBehavior 默认为 true。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多