如何在ASP.net自定义控件之间进行通信

时间:2010-04-29 08:06:49

标签: asp.net user-controls

我正在使用两个自定义控件。一个收集搜索条件,另一个显示列表。这两个控件暂时需要保持独立。

将数据从搜索控件传输到列表控件的最佳方法是什么?

我正在考虑在UpdatePanel中使用ViewState,Session或包装并使用自定义事件吗?

4 个答案:

答案 0 :(得分:1)

公开您拥有的数据类型的公共属性,然后公开将数据绑定到列表的公共方法

答案 1 :(得分:1)

如果控件是分开的,它们可能不应该直接通信。毕竟 - 大多数其他.NET控件也不直接通信。我只能想到两个例外 - 儿童/家长控制有时会传达基本信息;和数据绑定控件有时直接与DataSource通信。但这主要是它。

如果您需要连接两个相邻的控件,那么“正常”的方式就是他们的容器会处理它。比如,如果按钮单击会影响标签上的文本,那么处理Click事件并设置Text属性的是Page(两者的容器)。

或者你也可以给你的ListControl一个名为FindControl的属性,并在Page_Init或其他东西中分配它。但是如果耦合太紧,你可能想知道合并控件是否也不会更好。

答案 2 :(得分:1)

也许你可以创建一个委托和一个事件来传递一个搜索值列表?这样,您可以轻松添加另一个或多个显示控件,以备不时之需。

请注意,这只是一些应该优化/改进的快速示例代码。

public class SearchControl
{
    public delegate void SearchEventHandler(object sender, Dictionary<string, string> SearchValues);
    public event SearchEventHandler OnSearch;

    public SearchControl()
    {
        btnSearch.Click += new EventHandler(Search);
    }

    protected void Search(object sender, EventArgs e)
    {
        if (OnSearch != null)
        {
            Dictionary<string, string> searchValues = new Dictionary<string, string>();
            searchValues.Add("name", "John");
            searchValues.Add("age", "24");

            OnSearch(this, searchValues);
        }
    }
}

public class DisplayControl
{
    public void ShowResults(Dictionary<string, string> SearchValues)
    {
        // Some logic here...
    }
}

public class YourWebPage
{
    SearchControl searcher = new SearchControl();
    DisplayControl displayer = new DisplayControl();

    public YourWebPage()
    {
        searcher.OnSearch += new SearchControl.SearchEventHandler(searcher_OnSearch);
    }

    public void searcher_OnSearch(object sender, Dictionary<string, string> SearchValues)
    {
        displayer.ShowResults(SearchValues);
    }
}

答案 3 :(得分:0)

这取决于执行搜索的位置以及控件之间传输的数据。在我看来,最好只是将标准传递给页面并让页面运行搜索将它们绑定到列表控件以显示结果。