ObjectDataSource触发两次,或者单独触发

时间:2010-04-14 21:24:06

标签: asp.net data-binding gridview

有人可以准确解释ObjectDataSource是如何/何时触发的?我有一个带有GridView的ASP.NET页面,它引用了ODS。我在ODS正在使用的方法中设置了一个断点,并注意到它发射了两次。

我查看了代码,起初答案似乎很明显。我有

    Page_Load()
    {
      if(!Page.IsPostBack)
      {
          MethodA();
          MethodB();
      }
    }

其中MethodA和MethodB最终都调用了gv.DataBind()。这是有道理的,因为我假设每次调用GridView.DataBind()都会导致向ODS询问数据,从而运行我的数据访问方法。

奇怪的是,当注释掉对MethodA的调用时,仍然会触发两次。检查调用堆栈显示方法首先作为MethodB的结果运行,然后再次,除了[外部代码]之外没有任何跟踪。当我让MethodA和MethodB都执行时,这个神秘的负载会发生 not

知道这里发生了什么吗?知道我可能有什么其他代码,要求ODS提供数据吗?我开始认为所有这些“无代码”的数据控件都比它们的价值更加混淆和BS。

6 个答案:

答案 0 :(得分:3)

当我们在代码中动态隐藏/显示gridview列时,我遇到了这个问题。

这是一个页面,讨论可能导致多个选择的一些问题 http://forums.asp.net/t/1161164.aspx

答案 1 :(得分:1)

如果您正在更改可见性(即显示和/或隐藏)与对象数据源关联的网格视图的列,则可以隐式发生对gridview的数据绑定方法的多次调用。

在这种情况下,请尝试在Page_LoadComplete事件处理程序中封装show / hide gridview列代码。

Page_LoadComplete事件处理程序在页面生命周期中处于主要位置,以防止多个数据绑定调用,并且在控制更改事件(例如,按钮单击,下拉选定的索引更改等)之前调用它仍然有效gridview数据绑定事件。

答案 2 :(得分:0)

“当注释掉对Method的调用时,它仍会触发两次”。所以它可能会被调用两次Page_Load。可能你有AutoEventWireup =“true”并且还在代码http://www.aspdeveloper.net/tiki-index.php?page=ASPFaqEventsDoubleFire中注册事件

答案 3 :(得分:0)

如果使用类似

的方式设置gridview的数据源
gv.DataSourceID=dsObjDataSource;

然后网格视图自己调用gv.DataBind()

答案 4 :(得分:0)

我遇到了同样的问题 - 问题是我在数据绑定之后或期间隐藏/显示了一个列。移动隐藏/显示代码之前数据绑定停止绑定发生两次,我怀疑它与将其移动到Page_Load的效果相同。在我的情况下,数据绑定是为响应下拉列表框更改而发生的 - 在DataBind()调用之前执行列添加/删除为我修复了twofer问题。

答案 5 :(得分:0)

我使用asp:DataListasp:ObjectDataSource发生了两次DataBinding,结果相同。

原来是因为我在select参数中使用了UserControl:

<asp:ControlParameter Name="GroupID" Type="Int32" DefaultValue="-1"
    ControlID="UserControl1" PropertyName="SelectedGroupID" />

我厌倦了UserControls。我可以看到他们如何提高五年级学生的生产力,但他们完全浪费了更高层次的时间。