0

I am trying to write a custom DataSource control by inheriting System.Web.UI.WebControls.ObjectDataSource. Here is my code for my data source class.

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;
    }
}

I use my data source as follows:

    <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>

No code is written in my aspx.cs file and my code works fine if I write a hardcoded select logic in SelectAll method. But when I tried to use DataObjectTypeName property in SelectAll method I saw that this property has an empty string value. I put four break points in my data source code. First in the constructer, second in OnInit, third in OnLoad and last in SelectAll methods. Here is the list of where code has stopped and values of DataObjectTypeName when I run the project.

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

Q1: Why constructer is invoked twice?
Q2: Why DataObjectTypeName property is not assigned after second invocation of constructer?

Thanks in advance,
Mehmet.

1 Answer 1

2

Instead of Inheriting from the ObjectDataSource just use it as it was intended and pack all your login into a seperate object (another class) that the ObjectDataSource will actually use. Read the MSDN documentation about the class, it is quite robust and allows for unlimited possibilities...

Q1) And for your question, the constructor is called twice because the ObjectDataSource is trying to instanciate itself (That's what it does when you supply a TypeName) Q2) Answer one explaings your second question.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, for your answers. I will have a second look to my problem with your point of view.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.