我的主页面中有一个网格视图,我为用户显示了一些数据(使用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>
但它不起作用,没有任何事情发生。即使我为点击用户控制按钮代码添加了断点,但似乎事件没有提升。
答案 0 :(得分: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();
}
你会明白我的意思。尝试在主页面和用户控件的页面加载事件上设置断点,以确切了解事情发生的顺序。
答案 1 :(得分:0)
您可以在用户控件中注册一个事件,在用户点击更新按钮时引发事件并在页面上捕获该事件。
答案 2 :(得分:0)
你需要为那个
使用事件处理程序在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函数。