【问题标题】:How to communicate between user controls in Asp.Net如何在 Asp.Net 中的用户控件之间进行通信
【发布时间】:2014-10-31 22:13:29
【问题描述】:

我有 5 个文件。

  1. 默认.aspx
  2. Search.ascx
  3. 搜索SQL.ascx
  4. Grid.ascx
  5. GridSQL.ascx

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

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

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

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

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

【问题讨论】:

  • 您尚未显示 1) 您如何在代码中传递数据以及 2) 您的错误是什么。当我相信您的意思是说用户控件时,您的帖子也听起来像是在页面之间传递数据。请编辑您的问题以纠正这些问题。
  • 你可以使用 EventHandler 和公共属性。

标签: c# asp.net user-controls


【解决方案1】:

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

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

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

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

<%@ 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);
    }
}

【讨论】:

  • 非常感谢。有人还建议将数据传递到查询字符串中,然后在控制页面上读取它。这也是一个有效的选择吗(显然是少量和非敏感数据)?他说如果他们刷新,它仍然会显示相同的数据。
  • querystring 用于将一页传递到另一页。对于您的方案,这不是一个好方法,因为您需要重新加载整个页面才能让控件接收来自其他控件的消息。
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 2011-01-09
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
相关资源
最近更新 更多