【问题标题】:UpdatePanel where Button Event does not fire不触发按钮事件的 UpdatePanel
【发布时间】:2009-07-13 18:57:34
【问题描述】:

我有一个包含 PlaceHold 的 UpdatePanel。我创建了一些带有标签和按钮的控件,当单击按钮时,它会触发一个清除 PlaceHolder 并添加一些文本框和一个带有事件的按钮的事件。 问题是当单击此按钮时,它似乎会执行 PostBack 并且不会触发与 Button 关联的事件。我认为由于这些控件都包含在 UpdatePanel 中,所以不会是 PostBack,我是否错过了流程。

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<%--<%@ Register assembly="System.Web.DynamicData, Version=3.5.0.0, Culture=neutral,  PublicKeyToken=31bf3856ad364e35" namespace="System.Web.DynamicData" tagprefix="cc1" %>
--%>

<div id="content" >  <!--start content div-->
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <br />
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <br />
    <asp:UpdatePanel ID="upBlog" runat="server" UpdateMode="Conditional">
    <ContentTemplate >

         <asp:PlaceHolder ID="phBlog" runat="server"></asp:PlaceHolder>  
    </ContentTemplate>
    <Triggers >
 <%--   <asp:AsyncPostBackTrigger EventName="Click" ControlID = "btnSave" />--%>
    </Triggers>
    </asp:UpdatePanel>
    <br />
 </div> <!--ends content div-->

</asp:Content>

//后面的代码

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    FirstView();
}
protected void Page_Load(object sender, EventArgs e)
{

}

private void FirstView()
{
    FileStream fs = new FileStream(Server.MapPath(GlobalVar.compathver), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    DataSet dset = new DataSet();
    dset.ReadXml(fs);
    fs.Close();
//other controls
        Button btnComments = new Button();
        btnComments.ID = "mybtnComments" + i.ToString();
        btnComments.BorderWidth = 0;
        btnComments.Text = MyFunc.CountComments(row["ID"].ToString(), dset) + " Comments";
        phBlog.Controls.Add(btnComments);
        btnComments.CommandArgument = row["ID"].ToString();
        btnComments.BorderWidth = 0;

        btnComments.Command += new CommandEventHandler(Button1_Click)

}


private void CommentView(string  ID)   /// THIS DOES not FIRE
{
    DataView myCommentView = GetCommentView(ID);

       Button btnCommentSave = new Button();
        btnCommentSave.ID = "mySavebtnComments" + i.ToString();
        btnCommentSave.Text = "Publish";
        btnCommentSave.BackColor = Color.Aquamarine;
        phBlog.Controls.Add(btnCommentSave);
        btnCommentSave.CommandArgument = row["ID"].ToString();
        btnCommentSave.Click  += new EventHandler(btnSave_Click);


}




protected void Button1_Click(object sender, CommandEventArgs e)
{
    CommentView(e.CommandArgument.ToString());
}

protected void btnSave_Click(object sender, EventArgs e)
//protected void btnSave_Click(object sender, CommandEventArgs e)
{
    FileStream fsxml = new FileStream(Server.MapPath(GlobalVar.compathver), FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite);

    //other code
    // XML Document Saved
    xmldoc.Save(fsxml);
 }

【问题讨论】:

  • 你能发布一个标记的例子吗?

标签: asp.net ajax updatepanel


【解决方案1】:

UpdatePanel 仍会进行回发。单击按钮时会重复整个页面生命周期,因此将再次执行 Page_Init 和 Page_Load 示例。 AJAX 不会删除邮箱,只是对客户端隐藏它。

我显然看不出您发布的代码有什么问题,但是我建议您在 Page_Init 中放置一个断点作为开始。这将能够告诉您回发是否实际发生,因为如果按钮确实试图触发按钮单击事件,则会触发该事件。请记住,页面生命周期完成后(理论上)会触发任何点击事件。

再看一遍,我建议您将 FirstView() 方法中的 Button 事件更改为 Click 而不是 Command,看看这是否会触发事件。

【讨论】:

  • 请提供任何解决方案、代码等如何克服这个问题。看看my question看看能不能回答请
【解决方案2】:

在将控件添加到另一个容器之前,最好将任何事件添加到控件。

其次,参数名称为“btnCommentSave”的按钮将不起作用。您必须小心 OnInit、OnLoad 事件。这是服务器客户端问题。从服务器推送到客户端的页面不包含“btnCommentSave”按钮,因此该按钮停留在客户端页面但不起作用。

btnComments 有效,因为它是由服务器在 UpdatePanel 的 OnLoad 函数推送到客户端之前呈现的。

在 OnLoad 函数之后呈现的内容不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多