我有5个文件。
我已在default.aspx页面中注册了ascx文件,并使用属性将控件公开给默认页面。这很有效。
我的问题是如何在不同的ascx页面之间发送数据和第四个?如果我注册任何一个,它将给我一个循环文件引用错误。
使用公共属性,我在GridSQL.ascx上注册了Search.ascx,将搜索参数传递给Gridsql字符串,然后将Grid.ascx文件上的GridSQL.ascx传递给网格数据绑定。
必须有一种更简单的方法来传递数据BACK&页面之间的第四个,或者我错了?当您尝试在另一页上注册以将数据传递回发送它的页面时,您将收到循环文件引用错误。我听过一些决定,比如改变文件结构,我已经尝试过,还有批处理,但这会影响性能。相信我花了好几天试图找到解决方案。我打算对一些问题发表评论,但在我有50名代表之前,Stack不允许我这样做。
我的公司要求我们从现在开始使用所有单独的文件,我不能相信这是用户控件之间通信的最佳方式。
答案 0 :(得分:3)
正确的方法是将子控件的事件冒泡到父级。
然后让父母将事件转发给其他控件。
注意: 以下是演示。您可能希望重命名对您的方案有意义的委托和方法。
<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="Search.ascx.cs" Inherits="DemoWebForm.Search" %>
<asp:TextBox runat="server" ID="SearchTextBox" />
<asp:Button runat="server" ID="SearchButton"
Text="Search" OnClick="SearchButton_Click" />
public delegate void MessageHandler(string searchText);
public partial class Search : System.Web.UI.UserControl
{
public event MessageHandler SearchText;
protected void SearchButton_Click(object sender, EventArgs e)
{
SearchText(SearchTextBox.Text);
}
}
最后,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;
}
}
<%@ 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);
}
}