ASP.NET Custom ObjectDataSource - PullRequest
       7

ASP.NET Custom ObjectDataSource

0 голосов
/ 26 декабря 2010

Я пытаюсь написать пользовательский элемент управления DataSource, унаследовав System.Web.UI.WebControls.ObjectDataSource. Вот мой код для моего класса источника данных.

public class MyDataSource : ObjectDataSource
{
    public MyDataSource()
    {
        this.TypeName = GetType().FullName;
        this.SelectMethod = "SelectAll";
        this.SelectCountMethod = "SelectCount";
    }

    protected override void OnInit(System.EventArgs e)
    {
        base.OnInit(e);
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public DataTable SelectAll()
    {
        // Do something using this.DataObjectTypeName
        DataTable dt = new DataTable();
        // Fill DataTable
        return dt;
    }

    public int SelectCount()
    {
        // Here is not important yet
        return 20;
    }
}

Я использую свой источник данных следующим образом:

    <asp:GridView ID="grd" runat="server" AutoGenerateColumns="true" Width="100%"
    AllowPaging="true" AllowSorting="true" PageSize="10" DataSourceID="myDataSource">
    </asp:GridView>
    <cc2:MyDataSource ID="myDataSource" runat="server"
    DataObjectTypeName="MyLib.MyClass, MyLib">
    </cc2:MyDataSource>

В моем файле aspx.cs не написан код, и мой код работает нормально, если я пишу жестко запрограммированную логику выбора в методе SelectAll. Но когда я попытался использовать свойство DataObjectTypeName в методе SelectAll, я увидел, что это свойство имеет пустое строковое значение. Я поставил четыре точки останова в своем исходном коде данных. Первый в конструкторе, второй в OnInit, третий в OnLoad и последний в методах SelectAll. Вот список того, где код остановился, и значения DataObjectTypeName, когда я запускаю проект.

1) @Constructer: DataObjectTypeName = ""
2) @OnInit     : DataObjectTypeName = "MyLib.MyClass, MyLib"
3) @OnLoad     : DataObjectTypeName = "MyLib.MyClass, MyLib"
4) @Constructer: DataObjectTypeName = ""
5) @SelectAll  : DataObjectTypeName = ""

В1: Почему конструктор вызывается дважды?
Вопрос 2. Почему свойство DataObjectTypeName не назначается после второго вызова конструктора?

Заранее спасибо,
Мехмет.

1 Ответ

2 голосов
/ 27 декабря 2010

Вместо наследования от ObjectDataSource просто используйте его так, как было задумано, и упакуйте все свои логины в отдельный объект (другой класс), который на самом деле будет использовать ObjectDataSource.Прочитайте документацию MSDN о классе, он достаточно надежен и предоставляет неограниченные возможности ...

Q1) И по вашему вопросу, конструктор вызывается дважды, потому что ObjectDataSource пытается создать сам экземплярделает, когда вы вводите TypeName) Q2) Ответьте на одно объяснение вашего второго вопроса.

...