ObjectDataSource in ASP.NET 2.0

O

Ole M

I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.

I have a wrapper that contains the static methods for Select and Update. The
Update-method takes the business object as parameter.

When the Update-method is invoked by the ObjectDataSource, the object
referenced is not the same object returned by the Select-method, but a new
object with only the values from the Edit-template. So basically I get a
reference to a useless object here because it cannot be used by the DAL.

Is this a bug or a feature?

Here is some code to illustrate:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1">

<Columns>

<asp:CommandField ShowEditButton="True" />

<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />

</Columns>

</asp:GridView>

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
DataObjectTypeName="Customer"

SelectMethod="GetCustomers" TypeName="MyWrapperObj"
UpdateMethod="Save"></asp:ObjectDataSource>

And the C#-code:

public class Customer

{

private int id;

public int Id

{

get { return id; }

set { id = value; }

}

private string name;

public string Name

{

get { return name; }

set { name = value; }

}

public void Save()

{

// Do some things here...

}

}

public class MyWrapperObj

{

public static IList<Customer> GetCustomers()

{

List<Customer> customers = new List<Customer>();

for (int i = 0; i < 10; i++)

{

Customer customer = new Customer();

customer.Id = i;

customer.Name = string.Format("Name {0}", i);


customers.Add(customer);

}

return customers;

}

public static void Save(Customer obj)

{

obj.Save(); // This object is NOT in the IList returned by GetCustomers()

}

}
 
S

Steven Cheng[MSFT]

Hi Ole M,

Welcome to ASPNET newsgroup.

Regarding on the ObjectDataSource's update method's question, I think it's
the normal behavior which is expected.
For datasourcecontrol and databindig control, after the object data source
pass the data bojects to data controls, it no longer hold the actual
refernce of the oringial data(nor does the data binding control), also
since the actual backend datasource may vary (maybe database or xml file or
....), it don't quite makesense to maintain such a in-memory reference. In
fact, this also somewhat related to the ASP.NET application's runtime
model, it's request/response based, generally after page output response to
client, all the serverside objects will be disposed and in-memory reference
will no longer make sense in the next page lifecycle. This is diferent
from winform application. So in such scenario, we should update the
original object through its primary key value or retrieve the reference
again from orginal datasource, e.g:


======================

private static List<Employee> _list;
.......

public static void UpdateEmployee(Employee emp)
{
EmployeePredicate ep = new EmployeePredicate(emp.ID);

Employee employee = _list.Find(ep.Assert);

if (employee == null)
{
throw new Exception("Invalid Employee info in
UpdateEmployee()...");
}

employee.Name = emp.Name;
employee.Email = emp.Email;
}

public class EmployeePredicate
{
private long _id;

public EmployeePredicate(long id)
{
_id = id;
}

public bool Assert(Employee emp)
{
if (emp.ID == _id)
{
return true;
}
else
{
return false;
}
}

}

============================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)




--------------------
| From: "Ole M" <[email protected]>
| Subject: ObjectDataSource in ASP.NET 2.0
| Date: Mon, 31 Oct 2005 22:03:59 +0100
| Lines: 113
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <#[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135092
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
|
| I have a wrapper that contains the static methods for Select and Update.
The
| Update-method takes the business object as parameter.
|
| When the Update-method is invoked by the ObjectDataSource, the object
| referenced is not the same object returned by the Select-method, but a
new
| object with only the values from the Edit-template. So basically I get a
| reference to a useless object here because it cannot be used by the DAL.
|
| Is this a bug or a feature?
|
| Here is some code to illustrate:
|
| <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
| DataSourceID="ObjectDataSource1">
|
| <Columns>
|
| <asp:CommandField ShowEditButton="True" />
|
| <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name"
/>
|
| </Columns>
|
| </asp:GridView>
|
| <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| DataObjectTypeName="Customer"
|
| SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| UpdateMethod="Save"></asp:ObjectDataSource>
|
| And the C#-code:
|
| public class Customer
|
| {
|
| private int id;
|
| public int Id
|
| {
|
| get { return id; }
|
| set { id = value; }
|
| }
|
| private string name;
|
| public string Name
|
| {
|
| get { return name; }
|
| set { name = value; }
|
| }
|
| public void Save()
|
| {
|
| // Do some things here...
|
| }
|
| }
|
| public class MyWrapperObj
|
| {
|
| public static IList<Customer> GetCustomers()
|
| {
|
| List<Customer> customers = new List<Customer>();
|
| for (int i = 0; i < 10; i++)
|
| {
|
| Customer customer = new Customer();
|
| customer.Id = i;
|
| customer.Name = string.Format("Name {0}", i);
|
|
| customers.Add(customer);
|
| }
|
| return customers;
|
| }
|
| public static void Save(Customer obj)
|
| {
|
| obj.Save(); // This object is NOT in the IList returned by GetCustomers()
|
| }
|
| }
|
|
|
 
O

Ole M

Hi,

I see your point, but there is still a problem with the solution you have
there. The object passed to the Update(or in your case, UpdateEmployee)
method only contains values of the fields in the form. So, if the field "Id"
is not editable by the user, the value of "Id" is always 0.
 
S

Steven Cheng[MSFT]

Hi Ole M,

Thanks for your response. However, as for the further problem you
mentioned, I think we can still let the ID property being passed from
GridView's field to the DataSource for updating. The GridView can let us
specify "DataKeyNames" so as to indicate which field is the key column.
Also, for the fields, we can set the field's "readonly" and "Visible"
property so as to make the primary key field readonly or invisible. So
event we define the following gridView template schema:

==========
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"
AutoGenerateColumns="False" DataKeyNames="ID"
OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID"
ReadOnly="true" Visible="false" />
<asp:BoundField DataField="Name"
..................

==========================

The "ID" field is set to invisible, the value will still be passed to the
update event of the GridView or DataSource control. We can check it in the
GridView's RowUpdating event like below:

======================
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs
e)
{
foreach (string key in e.Keys.Keys)
{
Response.Write("<br>key: " + e.Keys[key]);
}

foreach (string key in e.OldValues.Keys)
{
Response.Write("<br>Oldvalue: " + e.OldValues[key]);
}

foreach (string key in e.NewValues.Keys)
{
Response.Write("<br>Newvalue: " + e.NewValues[key]);
}

}
=======================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)


--------------------
| From: "Ole M" <[email protected]>
| References: <#[email protected]>
<[email protected]>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Tue, 1 Nov 2005 14:53:16 +0100
| Lines: 229
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135220
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| I see your point, but there is still a problem with the solution you have
| there. The object passed to the Update(or in your case, UpdateEmployee)
| method only contains values of the fields in the form. So, if the field
"Id"
| is not editable by the user, the value of "Id" is always 0.
|
| "Steven Cheng[MSFT]" <[email protected]> skrev i melding
| | > Hi Ole M,
| >
| > Welcome to ASPNET newsgroup.
| >
| > Regarding on the ObjectDataSource's update method's question, I think
it's
| > the normal behavior which is expected.
| > For datasourcecontrol and databindig control, after the object data
source
| > pass the data bojects to data controls, it no longer hold the actual
| > refernce of the oringial data(nor does the data binding control), also
| > since the actual backend datasource may vary (maybe database or xml
file
| > or
| > ...), it don't quite makesense to maintain such a in-memory reference.
In
| > fact, this also somewhat related to the ASP.NET application's runtime
| > model, it's request/response based, generally after page output
response
| > to
| > client, all the serverside objects will be disposed and in-memory
| > reference
| > will no longer make sense in the next page lifecycle. This is diferent
| > from winform application. So in such scenario, we should update the
| > original object through its primary key value or retrieve the reference
| > again from orginal datasource, e.g:
| >
| >
| > ======================
| >
| > private static List<Employee> _list;
| > ......
| >
| > public static void UpdateEmployee(Employee emp)
| > {
| > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| >
| > Employee employee = _list.Find(ep.Assert);
| >
| > if (employee == null)
| > {
| > throw new Exception("Invalid Employee info in
| > UpdateEmployee()...");
| > }
| >
| > employee.Name = emp.Name;
| > employee.Email = emp.Email;
| > }
| >
| > public class EmployeePredicate
| > {
| > private long _id;
| >
| > public EmployeePredicate(long id)
| > {
| > _id = id;
| > }
| >
| > public bool Assert(Employee emp)
| > {
| > if (emp.ID == _id)
| > {
| > return true;
| > }
| > else
| > {
| > return false;
| > }
| > }
| >
| > }
| >
| > ============================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| > --------------------
| > | From: "Ole M" <[email protected]>
| > | Subject: ObjectDataSource in ASP.NET 2.0
| > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | Lines: 113
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <#[email protected]>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135092
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > |
| > | I have a wrapper that contains the static methods for Select and
Update.
| > The
| > | Update-method takes the business object as parameter.
| > |
| > | When the Update-method is invoked by the ObjectDataSource, the object
| > | referenced is not the same object returned by the Select-method, but a
| > new
| > | object with only the values from the Edit-template. So basically I
get a
| > | reference to a useless object here because it cannot be used by the
DAL.
| > |
| > | Is this a bug or a feature?
| > |
| > | Here is some code to illustrate:
| > |
| > | <asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
| > | DataSourceID="ObjectDataSource1">
| > |
| > | <Columns>
| > |
| > | <asp:CommandField ShowEditButton="True" />
| > |
| > | <asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name"
| > />
| > |
| > | </Columns>
| > |
| > | </asp:GridView>
| > |
| > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | DataObjectTypeName="Customer"
| > |
| > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | UpdateMethod="Save"></asp:ObjectDataSource>
| > |
| > | And the C#-code:
| > |
| > | public class Customer
| > |
| > | {
| > |
| > | private int id;
| > |
| > | public int Id
| > |
| > | {
| > |
| > | get { return id; }
| > |
| > | set { id = value; }
| > |
| > | }
| > |
| > | private string name;
| > |
| > | public string Name
| > |
| > | {
| > |
| > | get { return name; }
| > |
| > | set { name = value; }
| > |
| > | }
| > |
| > | public void Save()
| > |
| > | {
| > |
| > | // Do some things here...
| > |
| > | }
| > |
| > | }
| > |
| > | public class MyWrapperObj
| > |
| > | {
| > |
| > | public static IList<Customer> GetCustomers()
| > |
| > | {
| > |
| > | List<Customer> customers = new List<Customer>();
| > |
| > | for (int i = 0; i < 10; i++)
| > |
| > | {
| > |
| > | Customer customer = new Customer();
| > |
| > | customer.Id = i;
| > |
| > | customer.Name = string.Format("Name {0}", i);
| > |
| > |
| > | customers.Add(customer);
| > |
| > | }
| > |
| > | return customers;
| > |
| > | }
| > |
| > | public static void Save(Customer obj)
| > |
| > | {
| > |
| > | obj.Save(); // This object is NOT in the IList returned by
| > GetCustomers()
| > |
| > | }
| > |
| > | }
| > |
| > |
| > |
| >
|
|
|
 
O

Ole M

Hi,

Ah, great. I wasnt aware of the DataKeyNames property.

Thanks alot for the help!

Steven Cheng said:
Hi Ole M,

Thanks for your response. However, as for the further problem you
mentioned, I think we can still let the ID property being passed from
GridView's field to the DataSource for updating. The GridView can let us
specify "DataKeyNames" so as to indicate which field is the key column.
Also, for the fields, we can set the field's "readonly" and "Visible"
property so as to make the primary key field readonly or invisible. So
event we define the following gridView template schema:

==========
<asp:GridView ID="GridView1" runat="server"
DataSourceID="ObjectDataSource1"
AutoGenerateColumns="False" DataKeyNames="ID"
OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID"
ReadOnly="true" Visible="false" />
<asp:BoundField DataField="Name"
.................

==========================

The "ID" field is set to invisible, the value will still be passed to the
update event of the GridView or DataSource control. We can check it in the
GridView's RowUpdating event like below:

======================
protected void GridView1_RowUpdating(object sender,
GridViewUpdateEventArgs
e)
{
foreach (string key in e.Keys.Keys)
{
Response.Write("<br>key: " + e.Keys[key]);
}

foreach (string key in e.OldValues.Keys)
{
Response.Write("<br>Oldvalue: " + e.OldValues[key]);
}

foreach (string key in e.NewValues.Keys)
{
Response.Write("<br>Newvalue: " + e.NewValues[key]);
}

}
=======================

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)


--------------------
| From: "Ole M" <[email protected]>
| References: <#[email protected]>
<[email protected]>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Tue, 1 Nov 2005 14:53:16 +0100
| Lines: 229
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135220
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| I see your point, but there is still a problem with the solution you
have
| there. The object passed to the Update(or in your case, UpdateEmployee)
| method only contains values of the fields in the form. So, if the field
"Id"
| is not editable by the user, the value of "Id" is always 0.
|
| "Steven Cheng[MSFT]" <[email protected]> skrev i melding
| | > Hi Ole M,
| >
| > Welcome to ASPNET newsgroup.
| >
| > Regarding on the ObjectDataSource's update method's question, I think
it's
| > the normal behavior which is expected.
| > For datasourcecontrol and databindig control, after the object data
source
| > pass the data bojects to data controls, it no longer hold the actual
| > refernce of the oringial data(nor does the data binding control), also
| > since the actual backend datasource may vary (maybe database or xml
file
| > or
| > ...), it don't quite makesense to maintain such a in-memory reference.
In
| > fact, this also somewhat related to the ASP.NET application's runtime
| > model, it's request/response based, generally after page output
response
| > to
| > client, all the serverside objects will be disposed and in-memory
| > reference
| > will no longer make sense in the next page lifecycle. This is
diferent
| > from winform application. So in such scenario, we should update the
| > original object through its primary key value or retrieve the
reference
| > again from orginal datasource, e.g:
| >
| >
| > ======================
| >
| > private static List<Employee> _list;
| > ......
| >
| > public static void UpdateEmployee(Employee emp)
| > {
| > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| >
| > Employee employee = _list.Find(ep.Assert);
| >
| > if (employee == null)
| > {
| > throw new Exception("Invalid Employee info in
| > UpdateEmployee()...");
| > }
| >
| > employee.Name = emp.Name;
| > employee.Email = emp.Email;
| > }
| >
| > public class EmployeePredicate
| > {
| > private long _id;
| >
| > public EmployeePredicate(long id)
| > {
| > _id = id;
| > }
| >
| > public bool Assert(Employee emp)
| > {
| > if (emp.ID == _id)
| > {
| > return true;
| > }
| > else
| > {
| > return false;
| > }
| > }
| >
| > }
| >
| > ============================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| > --------------------
| > | From: "Ole M" <[email protected]>
| > | Subject: ObjectDataSource in ASP.NET 2.0
| > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | Lines: 113
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <#[email protected]>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135092
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > |
| > | I have a wrapper that contains the static methods for Select and
Update.
| > The
| > | Update-method takes the business object as parameter.
| > |
| > | When the Update-method is invoked by the ObjectDataSource, the
object
| > | referenced is not the same object returned by the Select-method, but
a
| > new
| > | object with only the values from the Edit-template. So basically I
get a
| > | reference to a useless object here because it cannot be used by the
DAL.
| > |
| > | Is this a bug or a feature?
| > |
| > | Here is some code to illustrate:
| > |
| > | <asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
| > | DataSourceID="ObjectDataSource1">
| > |
| > | <Columns>
| > |
| > | <asp:CommandField ShowEditButton="True" />
| > |
| > | <asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name"
| > />
| > |
| > | </Columns>
| > |
| > | </asp:GridView>
| > |
| > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | DataObjectTypeName="Customer"
| > |
| > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | UpdateMethod="Save"></asp:ObjectDataSource>
| > |
| > | And the C#-code:
| > |
| > | public class Customer
| > |
| > | {
| > |
| > | private int id;
| > |
| > | public int Id
| > |
| > | {
| > |
| > | get { return id; }
| > |
| > | set { id = value; }
| > |
| > | }
| > |
| > | private string name;
| > |
| > | public string Name
| > |
| > | {
| > |
| > | get { return name; }
| > |
| > | set { name = value; }
| > |
| > | }
| > |
| > | public void Save()
| > |
| > | {
| > |
| > | // Do some things here...
| > |
| > | }
| > |
| > | }
| > |
| > | public class MyWrapperObj
| > |
| > | {
| > |
| > | public static IList<Customer> GetCustomers()
| > |
| > | {
| > |
| > | List<Customer> customers = new List<Customer>();
| > |
| > | for (int i = 0; i < 10; i++)
| > |
| > | {
| > |
| > | Customer customer = new Customer();
| > |
| > | customer.Id = i;
| > |
| > | customer.Name = string.Format("Name {0}", i);
| > |
| > |
| > | customers.Add(customer);
| > |
| > | }
| > |
| > | return customers;
| > |
| > | }
| > |
| > | public static void Save(Customer obj)
| > |
| > | {
| > |
| > | obj.Save(); // This object is NOT in the IList returned by
| > GetCustomers()
| > |
| > | }
| > |
| > | }
| > |
| > |
| > |
| >
|
|
|
 
S

Steven Cheng[MSFT]

You're welcome Ole M,

Have a good day!

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: "Ole M" <[email protected]>
| References: <#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
| Subject: Re: ObjectDataSource in ASP.NET 2.0
| Date: Wed, 2 Nov 2005 11:51:05 +0100
| Lines: 339
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <#[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet:135459
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| Hi,
|
| Ah, great. I wasnt aware of the DataKeyNames property.
|
| Thanks alot for the help!
|
| "Steven Cheng[MSFT]" <[email protected]> skrev i melding
| | > Hi Ole M,
| >
| > Thanks for your response. However, as for the further problem you
| > mentioned, I think we can still let the ID property being passed from
| > GridView's field to the DataSource for updating. The GridView can let us
| > specify "DataKeyNames" so as to indicate which field is the key column.
| > Also, for the fields, we can set the field's "readonly" and "Visible"
| > property so as to make the primary key field readonly or invisible. So
| > event we define the following gridView template schema:
| >
| > ==========
| > <asp:GridView ID="GridView1" runat="server"
| > DataSourceID="ObjectDataSource1"
| > AutoGenerateColumns="False" DataKeyNames="ID"
| > OnRowUpdating="GridView1_RowUpdating">
| > <Columns>
| > <asp:CommandField ShowEditButton="True" />
| > <asp:BoundField DataField="ID" HeaderText="ID"
| > ReadOnly="true" Visible="false" />
| > <asp:BoundField DataField="Name"
| > .................
| >
| > ==========================
| >
| > The "ID" field is set to invisible, the value will still be passed to
the
| > update event of the GridView or DataSource control. We can check it in
the
| > GridView's RowUpdating event like below:
| >
| > ======================
| > protected void GridView1_RowUpdating(object sender,
| > GridViewUpdateEventArgs
| > e)
| > {
| > foreach (string key in e.Keys.Keys)
| > {
| > Response.Write("<br>key: " + e.Keys[key]);
| > }
| >
| > foreach (string key in e.OldValues.Keys)
| > {
| > Response.Write("<br>Oldvalue: " + e.OldValues[key]);
| > }
| >
| > foreach (string key in e.NewValues.Keys)
| > {
| > Response.Write("<br>Newvalue: " + e.NewValues[key]);
| > }
| >
| > }
| > =======================
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| > --------------------
| > | From: "Ole M" <[email protected]>
| > | References: <#[email protected]>
| > <[email protected]>
| > | Subject: Re: ObjectDataSource in ASP.NET 2.0
| > | Date: Tue, 1 Nov 2005 14:53:16 +0100
| > | Lines: 229
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <[email protected]>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl
| > microsoft.public.dotnet.framework.aspnet:135220
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > |
| > | Hi,
| > |
| > | I see your point, but there is still a problem with the solution you
| > have
| > | there. The object passed to the Update(or in your case,
UpdateEmployee)
| > | method only contains values of the fields in the form. So, if the
field
| > "Id"
| > | is not editable by the user, the value of "Id" is always 0.
| > |
| > | "Steven Cheng[MSFT]" <[email protected]> skrev i melding
| > | | > | > Hi Ole M,
| > | >
| > | > Welcome to ASPNET newsgroup.
| > | >
| > | > Regarding on the ObjectDataSource's update method's question, I
think
| > it's
| > | > the normal behavior which is expected.
| > | > For datasourcecontrol and databindig control, after the object data
| > source
| > | > pass the data bojects to data controls, it no longer hold the actual
| > | > refernce of the oringial data(nor does the data binding control),
also
| > | > since the actual backend datasource may vary (maybe database or xml
| > file
| > | > or
| > | > ...), it don't quite makesense to maintain such a in-memory
reference.
| > In
| > | > fact, this also somewhat related to the ASP.NET application's
runtime
| > | > model, it's request/response based, generally after page output
| > response
| > | > to
| > | > client, all the serverside objects will be disposed and in-memory
| > | > reference
| > | > will no longer make sense in the next page lifecycle. This is
| > diferent
| > | > from winform application. So in such scenario, we should update the
| > | > original object through its primary key value or retrieve the
| > reference
| > | > again from orginal datasource, e.g:
| > | >
| > | >
| > | > ======================
| > | >
| > | > private static List<Employee> _list;
| > | > ......
| > | >
| > | > public static void UpdateEmployee(Employee emp)
| > | > {
| > | > EmployeePredicate ep = new EmployeePredicate(emp.ID);
| > | >
| > | > Employee employee = _list.Find(ep.Assert);
| > | >
| > | > if (employee == null)
| > | > {
| > | > throw new Exception("Invalid Employee info in
| > | > UpdateEmployee()...");
| > | > }
| > | >
| > | > employee.Name = emp.Name;
| > | > employee.Email = emp.Email;
| > | > }
| > | >
| > | > public class EmployeePredicate
| > | > {
| > | > private long _id;
| > | >
| > | > public EmployeePredicate(long id)
| > | > {
| > | > _id = id;
| > | > }
| > | >
| > | > public bool Assert(Employee emp)
| > | > {
| > | > if (emp.ID == _id)
| > | > {
| > | > return true;
| > | > }
| > | > else
| > | > {
| > | > return false;
| > | > }
| > | > }
| > | >
| > | > }
| > | >
| > | > ============================
| > | >
| > | > Thanks,
| > | >
| > | > Steven Cheng
| > | > Microsoft Online Support
| > | >
| > | > Get Secure! www.microsoft.com/security
| > | > (This posting is provided "AS IS", with no warranties, and confers
no
| > | > rights.)
| > | >
| > | >
| > | >
| > | >
| > | > --------------------
| > | > | From: "Ole M" <[email protected]>
| > | > | Subject: ObjectDataSource in ASP.NET 2.0
| > | > | Date: Mon, 31 Oct 2005 22:03:59 +0100
| > | > | Lines: 113
| > | > | X-Priority: 3
| > | > | X-MSMail-Priority: Normal
| > | > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | > | X-RFC2646: Format=Flowed; Original
| > | > | Message-ID: <#[email protected]>
| > | > | Newsgroups: microsoft.public.dotnet.framework.aspnet
| > | > | NNTP-Posting-Host: fw.home.norlinux.com 213.187.183.210
| > | > | Path:
| > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| > | > | Xref: TK2MSFTNGXA01.phx.gbl
| > | > microsoft.public.dotnet.framework.aspnet:135092
| > | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| > | > |
| > | > | I'm having some trouble using the ObjectDataSource in ASP.NET 2.0.
| > | > |
| > | > | I have a wrapper that contains the static methods for Select and
| > Update.
| > | > The
| > | > | Update-method takes the business object as parameter.
| > | > |
| > | > | When the Update-method is invoked by the ObjectDataSource, the
| > object
| > | > | referenced is not the same object returned by the Select-method,
but
| > a
| > | > new
| > | > | object with only the values from the Edit-template. So basically I
| > get a
| > | > | reference to a useless object here because it cannot be used by
the
| > DAL.
| > | > |
| > | > | Is this a bug or a feature?
| > | > |
| > | > | Here is some code to illustrate:
| > | > |
| > | > | <asp:GridView ID="GridView1" runat="server"
| > AutoGenerateColumns="False"
| > | > | DataSourceID="ObjectDataSource1">
| > | > |
| > | > | <Columns>
| > | > |
| > | > | <asp:CommandField ShowEditButton="True" />
| > | > |
| > | > | <asp:BoundField DataField="Name" HeaderText="Name"
| > SortExpression="Name"
| > | > />
| > | > |
| > | > | </Columns>
| > | > |
| > | > | </asp:GridView>
| > | > |
| > | > | <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
| > | > | DataObjectTypeName="Customer"
| > | > |
| > | > | SelectMethod="GetCustomers" TypeName="MyWrapperObj"
| > | > | UpdateMethod="Save"></asp:ObjectDataSource>
| > | > |
| > | > | And the C#-code:
| > | > |
| > | > | public class Customer
| > | > |
| > | > | {
| > | > |
| > | > | private int id;
| > | > |
| > | > | public int Id
| > | > |
| > | > | {
| > | > |
| > | > | get { return id; }
| > | > |
| > | > | set { id = value; }
| > | > |
| > | > | }
| > | > |
| > | > | private string name;
| > | > |
| > | > | public string Name
| > | > |
| > | > | {
| > | > |
| > | > | get { return name; }
| > | > |
| > | > | set { name = value; }
| > | > |
| > | > | }
| > | > |
| > | > | public void Save()
| > | > |
| > | > | {
| > | > |
| > | > | // Do some things here...
| > | > |
| > | > | }
| > | > |
| > | > | }
| > | > |
| > | > | public class MyWrapperObj
| > | > |
| > | > | {
| > | > |
| > | > | public static IList<Customer> GetCustomers()
| > | > |
| > | > | {
| > | > |
| > | > | List<Customer> customers = new List<Customer>();
| > | > |
| > | > | for (int i = 0; i < 10; i++)
| > | > |
| > | > | {
| > | > |
| > | > | Customer customer = new Customer();
| > | > |
| > | > | customer.Id = i;
| > | > |
| > | > | customer.Name = string.Format("Name {0}", i);
| > | > |
| > | > |
| > | > | customers.Add(customer);
| > | > |
| > | > | }
| > | > |
| > | > | return customers;
| > | > |
| > | > | }
| > | > |
| > | > | public static void Save(Customer obj)
| > | > |
| > | > | {
| > | > |
| > | > | obj.Save(); // This object is NOT in the IList returned by
| > | > GetCustomers()
| > | > |
| > | > | }
| > | > |
| > | > | }
| > | > |
| > | > |
| > | > |
| > | >
| > |
| > |
| > |
| >
|
|
|
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,900
Latest member
Nell636132

Latest Threads

Top