如何在Asp.Net中的用户控件之间进行通信

时间:2014-10-31 13:34:45

标签: c# asp.net user-controls

我有5个文件。

  1. Default.aspx的
  2. Search.ascx
  3. SearchSQL.ascx
  4. Grid.ascx
  5. GridSQL.ascx
  6. 我已在default.aspx页面中注册了ascx文件,并使用属性将控件公开给默认页面。这很有效。

    我的问题是如何在不同的ascx页面之间发送数据和第四个?如果我注册任何一个,它将给我一个循环文件​​引用错误。

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

    必须有一种更简单的方法来传递数据BACK&页面之间的第四个,或者我错了?当您尝试在另一页上注册以将数据传递回发送它的页面时,您将收到循环文件引用错误。我听过一些决定,比如改变文件结构,我已经尝试过,还有批处理,但这会影响性能。相信我花了好几天试图找到解决方案。我打算对一些问题发表评论,但在我有50名代表之前,Stack不允许我这样做。

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

1 个答案:

答案 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(用户控制)

最后,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);
    }
}