Asp.Net CreateChildControls() - 使用Postback数据重新创建控件 - 事件

时间:2009-11-05 19:57:06

标签: asp.net user-controls

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

我有另一个控件,它是一个过滤器(在webpart外部)并且根据用户选择的过滤器控件的数据以及点击按钮后回发的内容,我必须显示过滤后的图表结果。问题是 CreateChildControls()在回发数据可用之前被调用(仅在 Page_Load 事件触发后才可用)。

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

这样的实现就像这样......

的WebParts

Page>用户控制> Webparts>复合控制/图表

过滤

Page>用户控制>复合控制[我在Postback上获取此数据]

2 个答案:

答案 0 :(得分:0)

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

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

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

然后在你的composit控件(有你的过滤器)中创建一个事件,比如

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方法的调用顺序。

答案 1 :(得分:0)

詹姆斯 - 感谢您的回答,但这似乎不适用于我的情景,或者说当我尝试它时,我无法使其发挥作用。控件似乎做得太多,并且从每个地方获取数据,它有自己的构造函数实现,Load()覆盖等等所以单个 UpdateChart()函数可能没有完成这个技巧情况下。

这就是我最后所做的。

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

让我知道这种实施会产生任何负面影响。