我在.Net中有一个WebPart自定义控件(Composite),它在页面加载时创建,使用'Dundas Charting Controls'显示图表(这是由页面内的用户控件创建的) )。我从数据库中获取此控件的属性。
我有另一个控件,它是一个过滤器(在webpart外部)并且根据用户选择的过滤器控件的数据以及点击按钮后回发的内容,我必须显示过滤后的图表结果。问题是 CreateChildControls()在回发数据可用之前被调用(仅在 Page_Load 事件触发后才可用)。
我无法及时获取此数据以传递用于过滤图表结果的参数。
这样的实现就像这样......
的WebParts
Page>用户控制> Webparts>复合控制/图表
过滤
Page>用户控制>复合控制[我在Postback上获取此数据]
答案 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为代价的请求。
让我知道这种实施会产生任何负面影响。