Hey guys,
I'm trying to bind a GridView to a DataTable which contains DataColumns of Type Boolean, String, Int32 and an Enumeration. When I bind it using AutoGenerateColumns = true the column containing the enum-values shows their int representation. I expected it to show as a dropdown like the standard DataGridView does.
Afterwards I tried to create the GridViewColumns myself but I can't figure out how to use the Enum as a DataSource for the GridViewComboBoxColumn. Here is my code:
Is this the right way to specify the DataSource? How do I need to specify the ValueMember and Displaymember?
The DropDown in the ComboBoxEditor shows the right (string) Values but the int-values of the rows aren't converted to that String-Representation.
If needed, here is the code of the enumeration:
Any hints?
Kind regards,
Nils
I'm trying to bind a GridView to a DataTable which contains DataColumns of Type Boolean, String, Int32 and an Enumeration. When I bind it using AutoGenerateColumns = true the column containing the enum-values shows their int representation. I expected it to show as a dropdown like the standard DataGridView does.
Afterwards I tried to create the GridViewColumns myself but I can't figure out how to use the Enum as a DataSource for the GridViewComboBoxColumn. Here is my code:
GridViewComboBoxColumn col5 = new GridViewComboBoxColumn("ResultType"); |
col5.DataSource = Enum.GetValues(typeof(EnumResultType)); |
col5.ValueMember = "???"; |
col5.DisplayMember = "???"; |
dgvDisciplines.MasterGridViewTemplate.Columns.Add(col5); |
Is this the right way to specify the DataSource? How do I need to specify the ValueMember and Displaymember?
The DropDown in the ComboBoxEditor shows the right (string) Values but the int-values of the rows aren't converted to that String-Representation.
If needed, here is the code of the enumeration:
public enum EnumResultType |
{ |
Maximum, |
Minimum, |
Summe, |
Durchschnitt |
} |
Any hints?
Kind regards,
Nils
5 Answers, 1 is accepted
0
Accepted
Hello Nils,
Thanks for writing.
I suggest wrapping the enum in a class as demonstrated below:
Then, follow these steps:
Please contact us if you need further assistance.
Regards,
Victor
the Telerik team
Check out Telerik Trainer, the state of the art learning tool for Telerik products.
Thanks for writing.
I suggest wrapping the enum in a class as demonstrated below:
public enum EnumResultType |
{ |
Minimum, Maximum, Summe, Durchschnitt |
} |
class EnumWrapper |
{ |
public int ID |
{ |
get; |
set; |
} |
public string Name |
{ |
get { return Enum.GetName(typeof(EnumResultType), ID); } |
set { ID = (int)Enum.Parse(typeof(EnumResultType), value); } |
} |
public EnumWrapper(EnumResultType value) |
{ |
ID = (int)value; |
} |
} |
Then, follow these steps:
- Create a DataTable and a column of type int add to it.
- Set the grid DataSource to the DataTable
- Create a GridViewComboBoxColumn and bind it to a list of objects of the class above
- Add the column to the grid Columns collection.
DataTable table = new DataTable(); |
table.Columns.Add("Value", typeof(int)); |
table.Rows.Add((int)MyEnum.Maximum); |
table.Rows.Add((int)MyEnum.Minimum); |
table.Rows.Add((int)MyEnum.Durchschnitt); |
List<EnumWrapper> list = new List<EnumWrapper>(); |
list.Add(new EnumWrapper(MyEnum.Durchschnitt)); |
list.Add(new EnumWrapper(MyEnum.Maximum)); |
list.Add(new EnumWrapper(MyEnum.Minimum)); |
list.Add(new EnumWrapper(MyEnum.Summe)); |
GridViewComboBoxColumn col = new GridViewComboBoxColumn("Value"); |
col.DataSource = list; |
col.DisplayMember = "Name"; |
col.ValueMember = "ID"; |
radGridView1.MasterGridViewTemplate.AutoGenerateColumns = false; |
radGridView1.Columns.Add(col); |
radGridView1.DataSource = table; |
Please contact us if you need further assistance.
Regards,
Victor
the Telerik team
Check out Telerik Trainer, the state of the art learning tool for Telerik products.
0
Nils
Top achievements
Rank 1
answered on 06 Jan 2009, 06:00 PM
Hi Victor,
thanks. I thought there is an easier method of databinding to a column of an Enum-Type. But your answer gave me the push to the right direction. Because there is more than one column of this kind I wrote a generic class which could be used for every kind of enum. Hopefully it is helpful for anyone who covers the same problem.
Here is my EnumWrapper-class:
And this is the way to use this class as a DataSource for a GridViewcomboBoxColumn:
Nothing more to do :) Thanks!
Kind regards,
Nils
thanks. I thought there is an easier method of databinding to a column of an Enum-Type. But your answer gave me the push to the right direction. Because there is more than one column of this kind I wrote a generic class which could be used for every kind of enum. Hopefully it is helpful for anyone who covers the same problem.
Here is my EnumWrapper-class:
class EnumWrapper<t> |
{ |
public int ID |
{ |
get; |
set; |
} |
public string Name |
{ |
get { return Enum.GetName(typeof(t), ID); } |
set { ID = (int)Enum.Parse(typeof(t), value); } |
} |
public EnumWrapper(t value) |
{ |
ID = (int)Enum.Parse(typeof(t), value.ToString()); |
} |
public static List<EnumWrapper<t>> EnumToList<t>() |
{ |
Type enumType = typeof(t); |
if (enumType.BaseType != typeof(Enum)) |
throw new ArgumentException("T must be of type System.Enum"); |
Array enumValArray = Enum.GetValues(enumType); |
List<EnumWrapper<t>> enumValList = new List<EnumWrapper<t>>(); |
foreach (int val in enumValArray) |
{ |
enumValList.Add(new EnumWrapper<t>((t)Enum.Parse(enumType, val.ToString()))); |
} |
return enumValList; |
} |
} |
And this is the way to use this class as a DataSource for a GridViewcomboBoxColumn:
GridViewComboBoxColumn col5 = new GridViewComboBoxColumn("ResultType"); |
col5.DataSource = EnumWrapper<EnumResultType>.EnumToList<EnumResultType>(); |
col5.ValueMember = "ID"; |
col5.DisplayMember = "Name"; |
dgvDisciplines.MasterGridViewTemplate.Columns.Add(col5); |
Nothing more to do :) Thanks!
Kind regards,
Nils
0
Hi Nils,
Thanks for sharing your solution with the community. We highly appreciate it.
Happy coding! :)
Greetings,
Victor
the Telerik team
Check out Telerik Trainer, the state of the art learning tool for Telerik products.
Thanks for sharing your solution with the community. We highly appreciate it.
Happy coding! :)
Greetings,
Victor
the Telerik team
Check out Telerik Trainer, the state of the art learning tool for Telerik products.
0
Michael Bakker
Top achievements
Rank 2
answered on 08 May 2014, 01:04 PM
Thanks for sharing your code. It's still relevant after 5 years!
0
Bilbo
Top achievements
Rank 1
Iron
answered on 16 Sep 2023, 01:18 AM
This code is still relevant near the end of 2023.... instantiating a DataGridViewComboBoxColumn is a tiny bit different than the old GridViewComboBoxColumn, but everything else still compiles and works today!