Добрый день. Я в ASP.NET новичок, поэтому не судите строго.
.NET 2.0, Visual Studio 2005, Developer Express .NET v8.1Хочу использовать ASPxGridView для работы с большими таблицами (порядка 100 тыс. записей) и организовать постраничный вывод. SqlDataSource не подходит, т.к. выбирает все строки, приходится долго ждать. Попытка прикрутить к ASPxGridView источник данных типа ObjectDataSource (через свойство DataSourceID, естественно) успехом не увенчалась - грид вызывает метод для загрузки данных, но в нем в качестве номера первой строки и кол-ва строк указывает нули, метод для получения суммарного кол-ва строк не вызывается вообще. Документация DevExpress рекомендует обратиться к xPersistentObjects, но их еще надо изучать.
Если ASPxGridView заменить на стандартный GridView, у которого свойство DataSourceID привязано к нашему ObjectDataSource, то все работает.
Код слоя доступа к данным:
// бизнес-объект
public class Employee
{
private decimal _EMP_ID;
public decimal EMP_ID
{
get { return _EMP_ID; }
set { _EMP_ID = value; }
}
private string _FIRST_NAME;
public string FIRST_NAME
{
get { return _FIRST_NAME; }
set { _FIRST_NAME = value; }
}
private string _LAST_NAME;
public string LAST_NAME
{
get { return _LAST_NAME; }
set { _LAST_NAME = value; }
}
private string _MIDDLE_NAME;
public string MIDDLE_NAME
{
get { return _MIDDLE_NAME; }
set { _MIDDLE_NAME = value; }
}
}
// класс-шлюз для работы с бизнес-объектами
public class tdgEmployees
{
public tdgEmployees()
{
}
private static string connectionString = ".......";
public static int GetTotalRowsCount()
{
OracleDataProvider provider = new OracleDataProvider();
DbManager.AddDataProvider(provider);
DbManager.AddConnectionString(".Oracle", connectionString);
DbManager db = new DbManager();
string sql = "SELECT count(EMP_ID) FROM spp_20employee";
db.SetCommand(sql);
object o = db.ExecuteScalar();
int count = 0;
if (o != null)
count = Convert.ToInt32(o);
return count;
}
public static DataSet Load(int firstRow, int totalRows)
{
OracleDataProvider provider = new OracleDataProvider();
DbManager.AddDataProvider(provider);
DbManager.AddConnectionString(".Oracle", connectionString);
DbManager db = new DbManager();
string sql = @"
select rn, emp_id, first_name, last_name, middle_name
from
(select emp_id, first_name, last_name, middle_name,
row_number() over (order by emp_id) rn
from spp_20employee)
where rn >= :firstRow and rn < :firstRow + :totalRows - 1";
db.SetCommand(sql);
db.Command.Parameters.Add(new OracleParameter(":firstRow", firstRow));
db.Command.Parameters.Add(new OracleParameter(":totalRows", totalRows));
DataSet ds = db.ExecuteDataSet();
db.Close();
return ds;
}
}
Вот в таком виде страничка работает:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnablePaging="True"
MaximumRowsParameterName="totalRows" SelectCountMethod="GetTotalRowsCount" SelectMethod="Load"
StartRowIndexParameterName="firstRow" TypeName="BusinessLogicLayer.tdgEmployees">
</asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="ObjectDataSource1">
</asp:GridView>
А вот в таком виде - нет (выводится грид с заголовком и надписью "There is no data to display" вместо данных):
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnablePaging="True"
MaximumRowsParameterName="totalRows" SelectCountMethod="GetTotalRowsCount" SelectMethod="Load"
StartRowIndexParameterName="firstRow" TypeName="BusinessLogicLayer.tdgEmployees">
</asp:ObjectDataSource>
<dxwgv:ASPxGridView ID="ASPxGridView1" runat="server" DataSourceID="ObjectDataSource1">
</dxwgv:ASPxGridView>