Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Asp.Net中实现用户控件之间的通信_C#_Asp.net_User Controls - Fatal编程技术网

C# 如何在Asp.Net中实现用户控件之间的通信

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

我有5个文件

  • Default.aspx
  • Search.ascx
  • SearchSQL.ascx
  • Grid.ascx
  • GridSQL.ascx
  • 我已在default.aspx页面中注册了ascx文件,并使用属性将控件公开到默认页面。这很有效

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

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

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


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

    正确的方法是将子控件的事件冒泡到父控件

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

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

    搜索(触发事件的用户控件)
    
    公共委托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);
        }
    }