我有一个ObjectDataSource
,其中配置了SelectMethod
和SelectParameters
。数据源绑定到网格视图,该网格视图在页面加载时成功显示数据。
我需要的是能够重新运行Select
定义的ObjectDataSource
方法以存储在变量中并操纵其中的项目。我一直遇到的问题是调用.Select()
方法总是返回0行,尽管它正确地填充了网格视图。
有没有理由我无法在对象数据源上手动重新运行Select()
方法?
以下是我设置ObjectDataSource
:
myObjectDataSource.TypeName = typeof(MyDataAccessObject).ToString();
myObjectDataSource.SelectMethod = "GetBy" + stringVariable;
myObjectDataSource.SelectCountMethod = "GetCountBy" + stringVariable;
myObjectDataSource.EnablePaging = true;
我在链接按钮的Select()
事件上运行OnClick
:
protected void LinkButton1_Click(object sender, EventArgs e)
{
SetupDataSource(); // populates the objSource's SelectMethod, SelectParameters and TypeName etc.
var items = objSource.Select();
int count = items.Count(); // returns 0;
}
在Page_Load
事件中设置了ObjectDataSource(SelectMethod和SelectParameters)。
ObjectDataSource
定义:
<asp:ObjectDataSource ID="objSource" runat="server" EnablePaging="True" SortParameterName="sortExpression" ></asp:ObjectDataSource>
GridView
定义:
<asp:GridView
ID="myGridView"
runat="server"
DataSourceID="objSource"
AllowPaging="true"
ShowHeader="true"
AutoGenerateColumns="false"
AllowSorting="true"
Width="100%" >
答案 0 :(得分:1)
事实证明,基础数据访问对象的方法考虑了分页,并且返回.Take(maximumRows)
始终为0。
作为一种解决方法,我通过myObjectDataSource.EnablePaging = false;
以编程方式禁用分页,然后创建了一个不考虑分页的新功能(需要新功能,因为ObjectDataSource
正在寻找具有特定参数的功能)。
答案 1 :(得分:0)
你没有提到何时(在什么情况下你试图重新绑定到DataSource) 简短的代码段可能会有所帮助。
如果你在Postback中,那么Gridview不会在回发时重新绑定,它们的行将从viewstate中撤回。在页面加载(或初始化?)时将gridview的DatasourceID重置为对象数据源ID将导致gridview反弹。
答案 2 :(得分:0)
之前我遇到过类似的问题。我认为.Select()是使用DataReader实现的,一旦读取器为空,就会调用Select,因此对.Select或.Count()的任何后续调用都将返回空结果。
因此,您可以做的是使用.ToList()将结果存储在列表中,然后继续重复使用列表。