C# 如何在Asp.Net中实现用户控件之间的通信
我有5个文件C# 如何在Asp.Net中实现用户控件之间的通信,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有5个文件 Default.aspx Search.ascx SearchSQL.ascx Grid.ascx GridSQL.ascx 我已在default.aspx页面中注册了ascx文件,并使用属性将控件公开到默认页面。这很有效 我的问题是如何在不同的ascx页面之间发送数据?如果我在其中任何一个注册,它会给我一个循环文件引用错误 使用公共属性,我在GridSQL.ascx上注册Search.ascx以将搜索参数传递到GridSQL字符串,然后在Grid.ascx文件上注册GridSQL
从现在起,我的公司要求我们使用所有单独的文件,我简直不敢相信这是用户控件之间通信的最佳方式。正确的方法是将子控件的事件冒泡到父控件 然后让父控件将事件转发给其他控件 注意:这是演示。您可能希望重命名对您的场景有意义的委托和方法 搜索(触发事件的用户控件)
公共委托void MessageHandler(字符串搜索文本);
公共部分类搜索:System.Web.UI.UserControl
{
公共事件消息处理程序搜索文本;
受保护的无效搜索按钮\u单击(对象发送者,事件参数e)
{
SearchText(SearchTextBox.Text);
}
}
GridSql(用户控制)
最后,GridSql.ascx接收搜索文本
<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="GridSql.ascx.cs" Inherits="DemoWebForm.GridSql" %>
<asp:Label runat="server" ID="SearchTextLabel"/>
public partial class GridSql : System.Web.UI.UserControl
{
public void SearchTextMethod(string searchText)
{
SearchTextLabel.Text = searchText;
}
}
公共部分类GridSql:System.Web.UI.UserControl
{
public void searchText方法(字符串searchText)
{
SearchTextLabel.Text=searchText;
}
}
父母亲
公共部分类父类:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
Search1.SearchText+=m=>GridSql1.SearchTextMethod(m);
}
}
正确的方法是将子控件的事件冒泡到父控件
然后让父控件将事件转发给其他控件
注意:这是演示。您可能希望重命名对您的场景有意义的委托和方法
搜索(触发事件的用户控件)
公共委托void MessageHandler(字符串搜索文本);
公共部分类搜索:System.Web.UI.UserControl
{
公共事件消息处理程序搜索文本;
受保护的无效搜索按钮\u单击(对象发送者,事件参数e)
{
SearchText(SearchTextBox.Text);
}
}
GridSql(用户控制)
最后,GridSql.ascx接收搜索文本
<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="GridSql.ascx.cs" Inherits="DemoWebForm.GridSql" %>
<asp:Label runat="server" ID="SearchTextLabel"/>
public partial class GridSql : System.Web.UI.UserControl
{
public void SearchTextMethod(string searchText)
{
SearchTextLabel.Text = searchText;
}
}
公共部分类GridSql:System.Web.UI.UserControl
{
public void searchText方法(字符串searchText)
{
SearchTextLabel.Text=searchText;
}
}
父母亲
公共部分类父类:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
Search1.SearchText+=m=>GridSql1.SearchTextMethod(m);
}
}
您没有显示1)如何在代码中传递数据,2)错误是什么。你的帖子听起来也像是在页面之间传递数据,而我相信你的意思是说用户控件。请编辑您的问题以更正这些问题。您可以使用EventHandler和公共属性。您尚未显示1)如何在代码中传递数据,以及2)错误是什么。你的帖子听起来也像是在页面之间传递数据,而我相信你的意思是说用户控件。请编辑您的问题以更正这些问题。您可以使用EventHandler和公共属性。非常感谢。有人还建议将数据传递到querystring,然后在控制页面上读取。这也是一个有效的选择吗(显然是少量和非敏感数据)?他说,如果它们刷新,它仍然会显示相同的数据。querystring用于将一页传递到另一页。对于您的场景,这不是一个好方法,因为您需要重新加载整个页面,以便一个控件接收来自其他控件的消息。非常感谢。有人还建议将数据传递到querystring,然后在控制页面上读取。这也是一个有效的选择吗(显然是少量和非敏感数据)?他说,如果它们刷新,它仍然会显示相同的数据。querystring用于将一页传递到另一页。对于您的场景来说,这不是一个好方法,因为您需要重新加载整个页面,以便控件从其他控件接收消息。
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Parent.aspx.cs" Inherits="DemoWebForm.Parent" %>
<%@ Register src="~/Search.ascx" tagname="Search" tagprefix="uc1" %>
<%@ Register src="~/GridSql.ascx" tagname="GridSql" tagprefix="uc2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<uc1:Search ID="Search1" runat="server" />
<uc2:GridSql ID="GridSql1" runat="server" />
</form>
</body>
</html>
public partial class Parent : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Search1.SearchText += m => GridSql1.SearchTextMethod(m);
}
}