ASPxGridView + ObjectDataSource + Paging

JohnSparrow
Дата: 01.06.2008 15:42:33
Добрый день. Я в 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>
pecha
Дата: 02.06.2008 16:09:46
http://asp.net/learn/data-access/tutorial-25-cs.aspx
- вот тут думаю найдешь ответы на твои вопрсы.

GoDevs.com
Domain Names | Web Hosting | ASP.NET 3.5 Hosting - $3.99/mo (10 GB Space, 300 GB Transfer, 200 MB MS SQL 2000/2005)
JohnSparrow
Дата: 03.06.2008 23:42:54
Спасибо, как раз это я и реализовал в приведенном выше куске кода. Ыы, неужели нет никаких вариантов?