【问题标题】:Asp.Net CreateChildControls() - Re create controls with Postback data - EventAsp.Net CreateChildControls() - 使用回发数据重新创建控件 - 事件
【发布时间】:2010-12-13 13:53:11
【问题描述】:

我在 .Net 中有一个 WebPart 自定义控件(复合),它是在页面加载时创建的,以使用 'Dundas Charting Controls' 显示图表(这是由页面内的用户控件创建的)。我从数据库中获取此控件的属性。

我有另一个控件,它是一个过滤器(外部 webpart),并且基于用户选择的这个过滤器控件的数据,我将在单击按钮后获得回发,我必须显示过滤后的图表结果。问题是 CreateChildControls() 在回发数据可用之前被调用(只有在 Page_Load 事件触发后才可用)。

我无法及时获取这些数据来传递用于过滤图表结果的参数。

这样的实现os ...

Webparts

页面 > 用户控件 > Webparts > 复合控件/图表

过滤器

页面 > 用户控件 > 复合控件 [我在回发中获取此数据]

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    听起来您遇到了事件排序问题。我总是试图让我的控件相对转储 - 所以他们并不真正知道他们是如何被使用的。

    考虑在图表控件中创建一个方法来强制更新其数据:

    public void UpdateChart(-- arguments as needed --)
    

    然后在您的合成控件(具有您的过滤器)中创建一个事件,例如

    public event Eventhandler FiltersChanged;
    

    将此分配给父页面上的事件处理程序:

    filterControl.FiltersChanged += new EventHandler(Filter_OnChange)
    

    然后创建一个事件处理程序,告诉您的图表控件有关更改

    Filter_OnChange(Object sender, EventArgs e)
    {
       // get whatever data you need from your filter control
       // tell the chart about the new data and have it reload/redraw
       myChart.UpdateData( - filter options here -}
    }
    

    这样做,您让页面指导操作顺序,而不依赖于调用子控件 Load 方法的顺序。

    【讨论】:

      【解决方案2】:

      James - 感谢您的回答,但这在我的场景中似乎不起作用,或者当我尝试它时我无法让它起作用。控件似乎做得太多了,并且从各个地方获取数据,它有自己的构造函数实现、Load() 覆盖等,因此单个 UpdateChart() 函数可能无法解决这个问题案例。

      这就是我最终所做的。

      我用过滤器数据触发 Ajax 请求,并在页面执行 回发 之前在 会话变量 中设置值,这样我就得到了所有地点/事件的数据,并在需要时传递与参数相同的数据。我知道实现这一点可能看起来很奇怪,但它保存了额外的数据库调用(在这种情况下,需要再次创建控件),即使它是以额外的服务器 HTTP ajax 为代价的请求。

      让我知道此实施可能会产生任何负面影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多