在这个页面中,使用了asp:UpdatePanel,我希望在PostMicroblog1中出发MicroBlogPosted事件,然后刷新用户控件ViewMicroBlogs1。但是事件触发以后ViewMicroBlogs1并没有被刷新,Page_Load函数没有调用。
    <uc2:PostMicroblog ID="PostMicroblog1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
       <ContentTemplate>
            <uc3:ViewMicroBlogs ID="ViewMicroBlogs1" runat="server" />
       </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="PostMicroblog1" 
                EventName="MicroBlogPosted" />
        </Triggers>
    </asp:UpdatePanel>我在PostMicroblog1中这样声明的事件。
public delegate void PostEventHandler(object sender, EventArgs e);
public event PostEventHandler MicroBlogPosted;
在PostMicroblog1中引发事件:
if (MicroBlogPosted != null)
{
MicroBlogPosted(this, new EventArgs());
}实在看不出哪里有错,请各位大神指教

解决方案 »

  1.   

    小例子Default.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><%@ Register Src="PostMicroblog1.ascx" TagName="PostMicroblog1" TagPrefix="uc1" %>
    <%@ Register Src="ViewMicroBlogs1.ascx" TagName="ViewMicroBlogs1" TagPrefix="uc2" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <style type="text/css">
            body, td, th
            {
                font-size: 12px;
            }
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <uc1:PostMicroblog1 ID="PostMicroblog1" runat="server" />
                <uc2:ViewMicroBlogs1 ID="ViewMicroBlogs1" runat="server" />
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="PostMicroblog1" EventName="MicroBlogPosted" />
            </Triggers>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>Default.aspx.cs
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PostMicroblog1.MicroBlogPosted += new global::PostMicroblog1.PostEventHandler(PostMicroblog1_MicroBlogPosted);
        }    protected void PostMicroblog1_MicroBlogPosted(object sender, EventArgs e)
        {
            ViewMicroBlogs1.Text = "文本";
        }
    }
    PostMicroblog1.ascx放一个ButtonPostMicroblog1.ascx.cs代码
    public partial class PostMicroblog1 : System.Web.UI.UserControl
    {
        public delegate void PostEventHandler(object sender, EventArgs e);
        public event PostEventHandler MicroBlogPosted;    protected void Page_Load(object sender, EventArgs e)
        {
            
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (MicroBlogPosted != null)
            {
                MicroBlogPosted(this, new EventArgs());
            }
        }
    }
    ViewMicroBlogs1.ascx放一个LabelViewMicroBlogs1.ascx.cs代码
    public partial class ViewMicroBlogs1 : System.Web.UI.UserControl
    {
        public string Text {
            get
            {
                if (ViewState["ViewText"] != null)
                {
                    return ViewState["ViewText"].ToString();
                }
                return "No";
            }
            set
            {
                ViewState["ViewText"] = value;
                Label1.Text = Text;
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = Text;
        }
    }
    已测试代码自己修改及优化
      

  2.   

    <Triggers>
                <asp:AsyncPostBackTrigger ControlID="PostMicroblog1" EventName="MicroBlogPosted" />
    </Triggers>
    如果你把触发器注释掉,会发现程序的功能和以前一模一样,完全是按钮点击所引起的回发,和事件MicroBlogPosted没关系啊。
      

  3.   

    我从来不使用触发器。首先任何页面上的操作都会触发回发,比如说在UpdatePanel之外的一个Button被按下,就会回发。然后在后台的事件处理过程中,你想刷新哪一个UpdatePanel就直接调用它的Update()方法就好了。如果你调用Update()方法,从来用不着触发器。
      

  4.   

    就你的代码来说,你可以在页面上注册监听MicroBlogPosted事件,然后在里边写一条语句 
    UpdatePanel1.Update();不过你的代码仍然不具有代表性。通常用户控件自己内部有UpdatePanel,用户控件自己负责刷新自己内部的界面。根本没有必要把ViewMicroBlogs1放在UpdatePanel1内部。正常地设计时序应该是,PostMicroblog1改变了某种状态而抛出事件,这个事件触发页面上的代码并且将事件参数相关的值或者PostMicroblog1相关的值传递给ViewMicroBlogs1。而这两个控件自己负责刷新自己内部的UpdatePanel。在你的页面上根本不需要放UpdatePanel控件。
      

  5.   

    好吧,我再详细描述一下我的问题
    两个用户控件,uc1负责发消息,uc2负责将消息显示出来。现在uc1和uc2在一个UpdatePanel中,那么uc1里面怎么调用Update方法?不用触发器,让uc1的按钮点击后自然刷新,那么页面先刷新后执行Button
    _Click中的代码,我刚发的消息也不能立即显示出来,还需要再刷新一次……这不是很头疼吗?