Asp.Net中用户控件之间如何通信

M H*_*M H 1 c# asp.net user-controls

我有5个文件。

  1. 默认.aspx
  2. 搜索.ascx
  3. 搜索SQL.ascx
  4. 网格.ascx
  5. GridSQL.ascx

我已在 default.aspx 页面中注册了 ascx 文件,并使用属性将控件公开给默认页面。这效果很好。

我的问题是如何在不同的 ascx 页面之间发送回和第四个数据?如果我注册其中任何一个,都会出现循环文件引用错误。

使用公共属性,我在 GridSQL.ascx 上注册了 Search.ascx,以将搜索参数传递到 Gridsql 字符串中,然后在 Grid.ascx 文件上注册 GridSQL.ascx,以将 sql 字符串传递到网格数据绑定。

必须有一种更简单的方法来在页面之间传递数据 BACK & FOURTH,还是我错了?当您尝试在其他页面上注册以将数据传递回发送它的页面时,您会收到循环文件引用错误。我听说过一些解决方案,例如更改文件结构(我已经尝试过)以及有关批处理的解决方案,但这会降低性能。相信我已经花了几天时间试图找到解决这个问题的方法。我本来打算对一些问题发表评论,但 Stack 不允许我发表评论,直到我有 50 名代表。

我的公司要求我们从现在开始使用所有单独的文件,我简直不敢相信这是用户控件之间通信的最佳方式。

Win*_*Win 5

正确的方法是您希望将子控件的事件冒泡到父控件。

然后让父控件将事件转发给其他控件。

注意:这是演示。您可能想要重命名对您的场景有意义的委托和方法。

搜索(触发事件的用户控件)

<%@ 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

家长

<%@ 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);
    }
}
Run Code Online (Sandbox Code Playgroud)