473,385 Members | 1,907 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

Bind an Array of Custom Objects

Jed
I have a web service method that returns an array of custom objects marked
serializeable with fully described public properties.

When I bind the results to a DataGrid I can access the properties in the
ItemDataBound event of the codebehind but I can't access them declaratively
in the HTML code?

Here is the code to call the method.
net.mysite.www.WSInterface proxy;
proxy = new net.mysite.www.WSInterface();
ProjectList[] pl = proxy.getProjects("%",false,true);
this.DataGrid1.DataSource = pl;
this.DataGrid1.DataBind();

Here is the code to access the property in the Item databound event.
lbl.Text = ((ProjectList)dg.DataItem).ClientName;

Here is the code that won't work on the HTML side:
Option 1:
<asp:BoundColumn HeaderText="Client Contact"
DataField="ClientContact"></asp:BoundColumn>

Option 2:
<asp:TemplateColumn HeaderText="Contact">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,
"ClientContact")%></ItemTemplate>
</asp:TemplateColumn>

Here is the error:
DataBinder.Eval: 'net.mysite.www.ProjectList' does not contain a property
with the name ClientContact.

Why can I access the property in the ItemDataBound event but not on the
declarative side?

The Page obviously know what kind of Object the data item is, otherwise the
error could not report it.

Any ideas? Thanks!
Nov 18 '05 #1
7 2534
Jed, dumb question: in your one that works, you use "ClientName", but in the
ones that don't you use "ClientContact". Is that right?

Bill

"Jed" wrote:
I have a web service method that returns an array of custom objects marked
serializeable with fully described public properties.

When I bind the results to a DataGrid I can access the properties in the
ItemDataBound event of the codebehind but I can't access them declaratively
in the HTML code?

Here is the code to call the method.
net.mysite.www.WSInterface proxy;
proxy = new net.mysite.www.WSInterface();
ProjectList[] pl = proxy.getProjects("%",false,true);
this.DataGrid1.DataSource = pl;
this.DataGrid1.DataBind();

Here is the code to access the property in the Item databound event.
lbl.Text = ((ProjectList)dg.DataItem).ClientName;

Here is the code that won't work on the HTML side:
Option 1:
<asp:BoundColumn HeaderText="Client Contact"
DataField="ClientContact"></asp:BoundColumn>

Option 2:
<asp:TemplateColumn HeaderText="Contact">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,
"ClientContact")%></ItemTemplate>
</asp:TemplateColumn>

Here is the error:
DataBinder.Eval: 'net.mysite.www.ProjectList' does not contain a property
with the name ClientContact.

Why can I access the property in the ItemDataBound event but not on the
declarative side?

The Page obviously know what kind of Object the data item is, otherwise the
error could not report it.

Any ideas? Thanks!

Nov 18 '05 #2
Jed
Unfortunately, no.

It is a good catch though. I noticed that after I posted. Both ClientName
and ClientContact are legitimate string properties of the object. I get the
same behaviour with both.

Thanks!

"Bill Borg" wrote:
Jed, dumb question: in your one that works, you use "ClientName", but in the
ones that don't you use "ClientContact". Is that right?

Bill

Nov 18 '05 #3
Hello Jed,

Because objects serialized from web services do not contain public properties,
they contain public fields. Fields are not able to be used for declarative
data binding.

The reason it works in your code-behind, is because you are referencing a
field, which is valid in code.

--
Matt Berther
http://www.mattberther.com
I have a web service method that returns an array of custom objects
marked serializeable with fully described public properties.

When I bind the results to a DataGrid I can access the properties in
the ItemDataBound event of the codebehind but I can't access them
declaratively in the HTML code?

Here is the code to call the method.
net.mysite.www.WSInterface proxy;
proxy = new net.mysite.www.WSInterface();
ProjectList[] pl = proxy.getProjects("%",false,true);
this.DataGrid1.DataSource = pl;
this.DataGrid1.DataBind();
Here is the code to access the property in the Item databound event.
lbl.Text = ((ProjectList)dg.DataItem).ClientName;

Here is the code that won't work on the HTML side:
Option 1:
<asp:BoundColumn HeaderText="Client Contact"
DataField="ClientContact"></asp:BoundColumn>
Option 2:
<asp:TemplateColumn HeaderText="Contact">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,
"ClientContact")%></ItemTemplate>
</asp:TemplateColumn>
Here is the error:
DataBinder.Eval: 'net.mysite.www.ProjectList' does not contain a
property
with the name ClientContact.
Why can I access the property in the ItemDataBound event but not on
the declarative side?

The Page obviously know what kind of Object the data item is,
otherwise the error could not report it.

Any ideas? Thanks!

Nov 18 '05 #4
Jed
Thanks, Matt,

Huh. I will look into that. I didn't know that there was even a "Field"
concept for class objects, nor do I even now understand how the Framework
maps my Property to this virtual "Field" value/construct.

Is there a best practices on how to overcome this (i.e.,custom
deserializer)? or is just impossible when working with web services?

Thanks again,
Jeff

"Matt Berther" wrote:
Hello Jed,

Because objects serialized from web services do not contain public properties,
they contain public fields. Fields are not able to be used for declarative
data binding.

The reason it works in your code-behind, is because you are referencing a
field, which is valid in code.

--
Matt Berther
http://www.mattberther.com

Nov 18 '05 #5
Hello Jed,

The differences between fields and properties are:

class Foo
{
public string Foo; // this is a field

private string bar;
public string Bar // this is a property
{
get { return bar; }
set { bar = value; }
}
}

According to this article [1] allowing databinding to fields is not something
thats going to change...

[1]http://www.nikhilk.net/Entry.aspx?id=42

Now, from what I've seen of ASP.NET 2.0, the class generated from the WSDL
has get/set properties instead of fields, so this might be good news for you.

Other than that, I imagine you could probably avoid using the web reference
and craft your communication layer yourself and get around this...

--
Matt Berther
http://www.mattberther.com
Thanks, Matt,

Huh. I will look into that. I didn't know that there was even a
"Field" concept for class objects, nor do I even now understand how
the Framework maps my Property to this virtual "Field"
value/construct.

Is there a best practices on how to overcome this (i.e.,custom
deserializer)? or is just impossible when working with web services?

Thanks again,
Jeff
"Matt Berther" wrote:
Hello Jed,

Because objects serialized from web services do not contain public
properties, they contain public fields. Fields are not able to be
used for declarative data binding.

The reason it works in your code-behind, is because you are
referencing a field, which is valid in code.

--
Matt Berther
http://www.mattberther.com

Nov 18 '05 #6
Hi,

I was searching the internet to find out how to bind the selected
columns of an array of custom objects to the datagrid and i found this
post on google groups. I want you to please have a look at my sample
code and let me know if i am on the right track or not. I am new to
..net and would like to have some guidance from u guys. here is what
iam trying to do:

1) get an array of objects from the web service method(for ex: lets
say there are 4 fields/properties for each object)
2) i want to bind only 2 fields/properties to the datagrid.
3) i have written an event handler that assigns the value of the
property to the literal control inside a datagrid's item template
column.
4) attached the event handler to the datagrid by using the
OnItemDataBound event of the datagrid
here is the code that i have:

event handler for the OnItemDataBound event :

public void Item_Bound(object sender, DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem)
{
Literal l = (Literal)e.Item.FindControl("lit");
if(l.Text == String.Empty)
{
l.Text = ((FormsOrderingWS.Order)
e.Item.DataItem).OrderDate.ToString();
}
}
}

HTML code for datagrid:

<asp:DataGrid OnItemDataBound="Item_Bound"......>
<asp:Columns>
<asp:TemplateColumn HeaderText="Order Date">
<ItemTemplate>
<asp:Literal ID="lit" Runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateColumn>
</asp:Columns>
</asp:DataGrid>
please suggest changes if iam wrong. Thank you
Nov 18 '05 #7
Jed
I don't see anything wrong with your approach.

In the end, I created a method to convert my object array to a DataSet so
that I could bind to the DataSet in the code, and also declaratively access
the property information from the HTML.

The sample is binding to a DropDown, which is the same as binding to a Grid
except that you have to specify, in the code, which fields represent the
Value and Text for each item. If you were using a DataGrid you could simple
use a BoundColumn to display the property values.

Here is the code I use:
/// <summary>
/// A method to convert an array of objects returned from a web service into
/// a DataSet so that they can be bound declaratively in the HTML. This is
to work
/// around the fact that the default Visual Studio WebServices references
/// deserialize object properties as fields instead of true get/set
properties.
/// </summary>
/// <param name="objectArray">The array of objects.</param>
/// <returns>A DataSet with a table named after the objectType.</returns>
public static DataSet ConvertObjectArrayToDataSet(object objectArray)
{
StringWriter writer = new StringWriter();
XmlSerializer serializer = new XmlSerializer(objectArray.GetType());
serializer.Serialize(writer, objectArray);
DataSet ds = new DataSet();
StringReader reader = new StringReader(writer.ToString());
ds.ReadXml(reader);
return ds;
}

// Here is an example of calling the static method and binding the
// resultant Dataset to a DropDown. The nice thing about this is
// that you can sort it before binding.
DataSet binder = Helpers.ConvertObjectArrayToDataSet(objs);
binder.Tables[0].DefaultView.Sort = "ClientName";
dropDown.DataSource = binder.Tables[0].DefaultView;
dropDown.DataValueField = "ID";
dropDown.DataTextField = "ClientName";
dropDown.DataBind();

"fd537" wrote:
Hi,

I was searching the internet to find out how to bind the selected
columns of an array of custom objects to the datagrid and i found this
post on google groups. I want you to please have a look at my sample
code and let me know if i am on the right track or not. I am new to
..net and would like to have some guidance from u guys. here is what
iam trying to do:

1) get an array of objects from the web service method(for ex: lets
say there are 4 fields/properties for each object)
2) i want to bind only 2 fields/properties to the datagrid.
3) i have written an event handler that assigns the value of the
property to the literal control inside a datagrid's item template
column.
4) attached the event handler to the datagrid by using the
OnItemDataBound event of the datagrid
here is the code that i have:

event handler for the OnItemDataBound event :

public void Item_Bound(object sender, DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem)
{
Literal l = (Literal)e.Item.FindControl("lit");
if(l.Text == String.Empty)
{
l.Text = ((FormsOrderingWS.Order)
e.Item.DataItem).OrderDate.ToString();
}
}
}

HTML code for datagrid:

<asp:DataGrid OnItemDataBound="Item_Bound"......>
<asp:Columns>
<asp:TemplateColumn HeaderText="Order Date">
<ItemTemplate>
<asp:Literal ID="lit" Runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateColumn>
</asp:Columns>
</asp:DataGrid>
please suggest changes if iam wrong. Thank you

Nov 19 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: Federico G. Babelis | last post by:
Hi All: I have this line of code, but the syntax check in VB.NET 2003 and also in VB.NET 2005 Beta 2 shows as unknown: Dim local4 As Byte Fixed(local4 = AddressOf dest(offset)) ...
2
by: Pete Nelson | last post by:
Does anyone know of a way to bind a string collection to a datagrid? Basically, I have an object, CreditPlans, and a string collection, ModelNumbers. I'd like to bind the ModelNumbers collection...
3
by: AFN | last post by:
In VB.NET, I can successfully bind a generic datagrid to a 1 dimensional array. But, now I want to add a button column, and so I think I need to make the first column (the one having data in the...
2
by: A Traveler | last post by:
Hi, I have a custom collection class i wrote, LineItemsCollection, which is a strongly typed collection of objects of my LineItem class. The LineItem class is a simple class with just a couple...
1
by: Luis Esteban Valencia | last post by:
Please everybody participate in this question. Hello my applicacion has many layers and classes and I think its well structured. PLease let me know if you disagree and why. 1. I have the user...
0
by: Giorgio | last post by:
It seems that the ASP.NET Microsoft team didn't think about this!! The profilemanager class has the following methods: - DeleteInactiveProfiles. Enables you to delete all profiles older...
0
by: a | last post by:
Q. Unable to get a Profile custom (object) collection to bind to GridView,etc (IList objects)? This is my first custom object so I may be doing something rather simple, wrong, or it may be...
0
by: sean worlock | last post by:
Hello all, I have googled like crazy for this with no sucess! I have a dataset containing a table with the following fields Table===Widths ---------------------------------------------...
17
by: =?Utf-8?B?U2hhcm9u?= | last post by:
Hi Gurus, I need to transfer a jagged array of byte by reference to unmanaged function, The unmanaged code should changed the values of the array, and when the unmanaged function returns I need...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.