How to Bind List<> to GridView with Custom Objects

J

Jonathan Wood

I see that I can create a List<string> list and bind it to a GridView
control (by setting the DataSource property to the list and calling the
DataBind method).

What's the trick to doing the same thing with my own classes instead of a
simple string? Is there an interface or something I can implement so that
the GridView control can detect the properties of my object and display them
?

Thanks.
 
N

Nick Bennett

You can just set the DataSource to be a List<MyObject> and DataBind. You
won't get any help with setting up the columns at design time if you do it
that way - you'll have type in all the details. If you want design time
help consider using an ObjectDataSource that points to a method that returns
the list.

Nick
 
J

Jonathan Wood

Nick,
You can just set the DataSource to be a List<MyObject> and DataBind. You
won't get any help with setting up the columns at design time if you do it
that way - you'll have type in all the details. If you want design time
help consider using an ObjectDataSource that points to a method that
returns the list.

Yeah, that's how it's done with a List<string> so I thought that might work.
But, with my class defined like this:

public class ClientMenuItem
{
public int MealNum;
public float Substitutions;
public string Group;
public float Units;
public string Measure;
public string Description;
public float Calories;
public float Protein;
public float Carbohydrate;
public float Fat;
}

I tried the following:

List<ClientMenuItem> items = ClientUsers.GetMenuItems(menus[0].MenuID);
GridView1.DataSource = items;
GridView1.DataBind();

And I get the following error at runtime on the last line above:

"The data source for GridView with id 'GridView1' did not have any
properties or attributes from which to generate columns. Ensure that your
data source has content."
 
N

Nick Bennett

The message is correct: your class doesn't have any properties - it has
public fields, which isn't a good thing. Try replacing your fields with
properties - e.g. convert

public int MealNum;

to

public int MealNum { get; set; }

if you're in VS2008, or this

private int _mealNum;

public int MealNum
{
get { return _mealNum; }
set { _mealNum = value; }
}

if in VS2005 or VS2003.





Jonathan Wood said:
Nick,
You can just set the DataSource to be a List<MyObject> and DataBind. You
won't get any help with setting up the columns at design time if you do
it that way - you'll have type in all the details. If you want design
time help consider using an ObjectDataSource that points to a method that
returns the list.

Yeah, that's how it's done with a List<string> so I thought that might
work. But, with my class defined like this:

public class ClientMenuItem
{
public int MealNum;
public float Substitutions;
public string Group;
public float Units;
public string Measure;
public string Description;
public float Calories;
public float Protein;
public float Carbohydrate;
public float Fat;
}

I tried the following:

List<ClientMenuItem> items = ClientUsers.GetMenuItems(menus[0].MenuID);
GridView1.DataSource = items;
GridView1.DataBind();

And I get the following error at runtime on the last line above:

"The data source for GridView with id 'GridView1' did not have any
properties or attributes from which to generate columns. Ensure that your
data source has content."
 
J

Jonathan Wood

That's the deal? I thought about that. Actually, I was putting all
properties in my classes until I decided it was WAAAAAAAAAAAAY too much
typing and just seemed unnecessary.

Yup, that's it! Nice. Cool feature.

Thanks.

--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com

Nick Bennett said:
The message is correct: your class doesn't have any properties - it has
public fields, which isn't a good thing. Try replacing your fields with
properties - e.g. convert

public int MealNum;

to

public int MealNum { get; set; }

if you're in VS2008, or this

private int _mealNum;

public int MealNum
{
get { return _mealNum; }
set { _mealNum = value; }
}

if in VS2005 or VS2003.





Jonathan Wood said:
Nick,
You can just set the DataSource to be a List<MyObject> and DataBind. You
won't get any help with setting up the columns at design time if you do
it that way - you'll have type in all the details. If you want design
time help consider using an ObjectDataSource that points to a method
that returns the list.

Yeah, that's how it's done with a List<string> so I thought that might
work. But, with my class defined like this:

public class ClientMenuItem
{
public int MealNum;
public float Substitutions;
public string Group;
public float Units;
public string Measure;
public string Description;
public float Calories;
public float Protein;
public float Carbohydrate;
public float Fat;
}

I tried the following:

List<ClientMenuItem> items = ClientUsers.GetMenuItems(menus[0].MenuID);
GridView1.DataSource = items;
GridView1.DataBind();

And I get the following error at runtime on the last line above:

"The data source for GridView with id 'GridView1' did not have any
properties or attributes from which to generate columns. Ensure that
your data source has content."
 
M

Milosz Skalecki [MCAD]

Howdy,

You don't need to type property declaration yourself. VS >= 2005 supports
refactoring and includes very useful commands to make your life easier:
Three ways to quickly implement a property:
1. Press Ctrl+K,X or go to main menu Edit->Intelli Sense->Insert Snippet
select "prop" or Visual C#\prop from drop down list, and change property's
type and name.
2. in the code type
private [AnyType] fieldName;
(Ctrl+R,E) or right click -> Refactor ->Encapsulate Field.
3. Create class diagram, and design your classes through a GUI.

Hope this helps
--
Milosz


Jonathan Wood said:
That's the deal? I thought about that. Actually, I was putting all
properties in my classes until I decided it was WAAAAAAAAAAAAY too much
typing and just seemed unnecessary.

Yup, that's it! Nice. Cool feature.

Thanks.

--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com

Nick Bennett said:
The message is correct: your class doesn't have any properties - it has
public fields, which isn't a good thing. Try replacing your fields with
properties - e.g. convert

public int MealNum;

to

public int MealNum { get; set; }

if you're in VS2008, or this

private int _mealNum;

public int MealNum
{
get { return _mealNum; }
set { _mealNum = value; }
}

if in VS2005 or VS2003.





Jonathan Wood said:
Nick,

You can just set the DataSource to be a List<MyObject> and DataBind. You
won't get any help with setting up the columns at design time if you do
it that way - you'll have type in all the details. If you want design
time help consider using an ObjectDataSource that points to a method
that returns the list.

Yeah, that's how it's done with a List<string> so I thought that might
work. But, with my class defined like this:

public class ClientMenuItem
{
public int MealNum;
public float Substitutions;
public string Group;
public float Units;
public string Measure;
public string Description;
public float Calories;
public float Protein;
public float Carbohydrate;
public float Fat;
}

I tried the following:

List<ClientMenuItem> items = ClientUsers.GetMenuItems(menus[0].MenuID);
GridView1.DataSource = items;
GridView1.DataBind();

And I get the following error at runtime on the last line above:

"The data source for GridView with id 'GridView1' did not have any
properties or attributes from which to generate columns. Ensure that
your data source has content."
 
J

Jonathan Wood

Sorry for the slow delay but the Encapsulate Field command looks like the
one I was trying to find.

Thanks!

--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com

Milosz Skalecki said:
Howdy,

You don't need to type property declaration yourself. VS >= 2005 supports
refactoring and includes very useful commands to make your life easier:
Three ways to quickly implement a property:
1. Press Ctrl+K,X or go to main menu Edit->Intelli Sense->Insert Snippet
select "prop" or Visual C#\prop from drop down list, and change property's
type and name.
2. in the code type
private [AnyType] fieldName;
(Ctrl+R,E) or right click -> Refactor ->Encapsulate Field.
3. Create class diagram, and design your classes through a GUI.

Hope this helps
--
Milosz


Jonathan Wood said:
That's the deal? I thought about that. Actually, I was putting all
properties in my classes until I decided it was WAAAAAAAAAAAAY too much
typing and just seemed unnecessary.

Yup, that's it! Nice. Cool feature.

Thanks.

--
Jonathan Wood
SoftCircuits Programming
http://www.softcircuits.com

Nick Bennett said:
The message is correct: your class doesn't have any properties - it has
public fields, which isn't a good thing. Try replacing your fields
with
properties - e.g. convert

public int MealNum;

to

public int MealNum { get; set; }

if you're in VS2008, or this

private int _mealNum;

public int MealNum
{
get { return _mealNum; }
set { _mealNum = value; }
}

if in VS2005 or VS2003.





Nick,

You can just set the DataSource to be a List<MyObject> and DataBind.
You
won't get any help with setting up the columns at design time if you
do
it that way - you'll have type in all the details. If you want
design
time help consider using an ObjectDataSource that points to a method
that returns the list.

Yeah, that's how it's done with a List<string> so I thought that might
work. But, with my class defined like this:

public class ClientMenuItem
{
public int MealNum;
public float Substitutions;
public string Group;
public float Units;
public string Measure;
public string Description;
public float Calories;
public float Protein;
public float Carbohydrate;
public float Fat;
}

I tried the following:

List<ClientMenuItem> items =
ClientUsers.GetMenuItems(menus[0].MenuID);
GridView1.DataSource = items;
GridView1.DataBind();

And I get the following error at runtime on the last line above:

"The data source for GridView with id 'GridView1' did not have any
properties or attributes from which to generate columns. Ensure that
your data source has content."
 

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

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top