Asp.net ObjectDataSource触发两次或单独触发

Asp.net ObjectDataSource触发两次或单独触发,asp.net,data-binding,gridview,Asp.net,Data Binding,Gridview,有人能准确地解释ObjectDataSource如何/何时触发吗?我有一个ASP.NET页面,带有GridView,它引用了ODS。我在ODS使用的方法中设置了一个断点,并注意到它触发了两次 我看了看代码,一开始答案似乎很明显。我有 Page_Load() { if(!Page.IsPostBack) { MethodA(); MethodB(); } } 其中MethodA和MethodB最终

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

我看了看代码,一开始答案似乎很明显。我有

    Page_Load()
    {
      if(!Page.IsPostBack)
      {
          MethodA();
          MethodB();
      }
    }
其中MethodA和MethodB最终都调用了gv.DataBind()。这是有意义的,因为我假设每次调用GridView.DataBind()都会导致向ODS请求数据,从而运行我的数据访问方法

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


知道这是怎么回事吗?你知道我还有什么其他的代码要求ODS提供数据吗?我开始认为所有这些“无代码”数据控件都比它们的价值更模糊和模糊。

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

这是一个讨论可能导致多次选择的一些问题的页面
“当注释掉对MethodA的调用时,它仍然会触发两次”。因此,可能会调用两次页面加载。如果将gridview的数据源设置为

gv.DataSourceID=dsObjDataSource;

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

我也有同样的问题-问题是我在数据绑定之后或期间隐藏/显示列。在数据绑定之前移动隐藏/显示代码,使绑定停止了两次,我怀疑这与将其移动到页面加载的效果相同。在我的例子中,数据绑定是响应下拉列表框更改而发生的-在调用
databind()
之前添加/删除列修复了twofer问题。

使用
asp:DataList
asp:ObjectDataSource
进行两次数据绑定时,我得到了相同的结果

这是因为我在选择参数中使用了UserControl:

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


我对用户控件越来越厌倦了。我可以看出这对五年级学生来说是如何提高生产率的,但在更高的层次上,这完全是浪费时间。

如果更改可见性(即显示和/或隐藏绑定到对象数据源的gridview列),则可能会隐式调用gridview的databind方法

在此场景中,尝试在Page_LoadComplete事件处理程序中封装显示/隐藏gridview列代码


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

不,看起来页面加载只被调用了一次。谢谢你的链接,我来看看。是的,结果就是,我们在GridView.DataBound事件中隐藏/显示列,如果我们不这样做,它不会触发两次。我会查看您的链接,但您使用了哪种方法来解决这种情况?这两个文件中的哪一个设置了该属性(aspx和aspx.cs)与我们的场景没有区别。事实证明,我们在标记中指定了一些列,ods将第一次获得这些列并进行绑定,然后我们用ITemplate类动态地注入列,这会触发重新绑定。我讨厌ODS。事实上,我已经厌倦了ASP.NET webforms。换了工作,现在我在做MVC。它并不完美,但我并不怀念webforms控件的黑匣子狂热。