【问题标题】:Update Main page from user control从用户控件更新主页
【发布时间】:2012-06-29 18:37:26
【问题描述】:

我的主页中有一个网格视图,我为用户显示一些数据(使用BindGrid 方法)。这个网格视图的每一行都有一些命令按钮,它们执行一些操作,如Update。当用户单击更新按钮时,我向他/她显示更新值的用户控件。当用户单击更新时,我希望网格绑定到新数据(我想调用 BindGrid 获取新数据)。我该如何做到这一点并从用户控件调用主页中的方法?

编辑 1)

我为用户控制编写了这段代码:

public partial class SomeUserControl : System.Web.UI.UserControl
{
public event EventHandler StatusUpdated;

private void FunctionThatRaisesEvent()
{
    if (this.StatusUpdated != null)
        this.StatusUpdated(new object(), new EventArgs());
} 


public void Page_Load(object sender, EventArgs e)
{
    //.... 
}

protected void Button1_Click(object sender, EventArgs e)
{
    FunctionThatRaisesEvent();
}
}

以及用户控制设计器:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SomeUserControl.ascx.cs" Inherits="SomeUserControl" %>
<asp:Button ID="Button1" runat="server" Text="Update" Height="70px" 
onclick="Button1_Click" Width="183px" />

并为主页添加此代码:

protected void Page_Load(object sender, EventArgs e)
{

}
protected void Unnamed1_Click(object sender, EventArgs e)
{
    SomeUserControl userControl = (SomeUserControl)LoadControl("SomeUserControl.ascx");
    userControl.StatusUpdated += new EventHandler(userControl_StatusUpdated);
    Panel1.Controls.Add(userControl);
}

void userControl_StatusUpdated(object sender, EventArgs e)
{
    GetDate();
}

private void GetDate()
{
    TextBox1.Text = DateTime.Today.ToString();
}

主页设计师:

<%@ Register src="SomeUserControl.ascx" tagname="SomeUserControl" tagprefix="uc1" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:UpdatePanel ID="upd1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:Button runat="server" Text="Add User Control" Height="44px"  ID="Nims"
                onclick="Unnamed1_Click" Width="133px" />
                <asp:Panel ID="Panel1" runat="server" BackColor="#FFFFCC"></asp:Panel>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>

    </form>
</body>
</html>

但它不起作用,也没有发生任何事情。即使我为单击用户控制按钮代码添加了断点,但似乎该事件没有引发。

【问题讨论】:

    标签: c# asp.net gridview user-controls


    【解决方案1】:

    从用户控件引发事件,并从主页处理事件。查看this question

    //** 编辑**//

    您正在单击按钮时动态添加用户控件。当您单击用户控件上的按钮时,它首先会在主页上启动回发 - 现在您的用户控件不再存在(这就是不引发事件的原因)。如果您将主页设计器更改为如下所示:

    <%@ Register Src="SomeUserControl.ascx" tagname="SomeUserControl" tagprefix="uc1" %>
    
    <!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 id="Head1" runat="server">
        <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:UpdatePanel ID="upd1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:Button runat="server" Text="Add User Control" Height="44px"  ID="Nims"
                onclick="Unnamed1_Click" Width="133px" />
                <asp:Panel ID="Panel1" runat="server" BackColor="#FFFFCC">
                <uc1:SomeUserControl ID="userControl" runat="server" />
                </asp:Panel>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    
    </form>
    

    你的代码隐藏看起来像这样

    protected void Page_Load(object sender, EventArgs e)
    {
        userControl.StatusUpdated += new EventHandler(userControl_StatusUpdated);
    }
    
    void userControl_StatusUpdated(object sender, EventArgs e)
    {
        GetDate();
    }
    
    private void GetDate()
    {
        TextBox1.Text = DateTime.Today.ToString();
    }
    

    你会明白我的意思。尝试在主页和用户控件的页面加载事件上设置断点,以准确查看事情发生的顺序。

    【讨论】:

      【解决方案2】:

      您可以在您的用户控件中注册一个事件,当用户单击更新按钮时引发该事件并在页面上捕获该事件。

      http://codebetter.com/brendantompkins/2004/10/06/easily-raise-events-from-asp-net-ascx-user-controls/

      【讨论】:

        【解决方案3】:

        您需要为此使用事件处理程序

        在 ascx 页面中定义事件处理程序

        public event EventHandler ButtonClickDemo;
        

        当您执行更新或删除事件时,请使用以下代码作为事件处理程序。

           ButtonClickDemo(sender, e);
        

        在父页面中使用以下

          protected void Page_Load(object sender, EventArgs e)
          {
                 btnDemno.ButtonClickDemo += new EventHandler(btn_Click);
          }
        

        父页面网格绑定功能

          protected void btn_Click(object sender, EventArgs e)
          {
                    BindGrid();
          }
        

        以上代码会调用父页面的BindGrid函数。

        【讨论】:

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