This is a migrated thread and some comments may be shown as answers.

Group column that DataMemberBinding is binded by "Enum"

5 Answers 271 Views
GridView
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Ph?m H?ng Van
Top achievements
Rank 1
Ph?m H?ng Van asked on 23 Jul 2010, 05:38 AM
Hello,
I have a question regarding grouping of a GridViewDataColumn.

<Grid x:Name="LayoutRoot">
        <Grid.Resources>
            <local:EnumConverter x:Key="myConverter"></local:EnumConverter>
        </Grid.Resources>
            <telerik:RadGridView Name="gridView" >
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn Header="Custom Enum" DataMemberBinding="{Binding Gender}">
                    <telerik:GridViewDataColumn.CellTemplate>
                        <DataTemplate>                            
                            <TextBlock  Text="{Binding Gender, Converter={StaticResource myConverter}}" />
                        </DataTemplate>
                    </telerik:GridViewDataColumn.CellTemplate>
                </telerik:GridViewDataColumn>
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>
    </Grid>


I explain my code : "Gender" property is Boolean type. If "Gender" = False , Converter return "male" and If "Gender" = True, Converter return "female" . It displays well and sorting well.
But when i grouping, panel group text display "false" or "true" . I want it displays "male" or "female" .
The same problem with filtering.
Thanks !

5 Answers, 1 is accepted

Sort by
0
Maya
Telerik team
answered on 23 Jul 2010, 11:23 AM
Hello van pham hong,

This is caused as a converter provides only UI visualization, but the grid performs the operations on the data-source level. 
However, there are a couple of workarounds here. Firstly, you can create a ViewModel that embeds the the property which is converted - in your project Male/Female. Thus you will be able to bind the column directly to the property defined in this class. I am sending you a sample project illustrating that suggestion. In the application attached the data in the last column is a concatenation of the three before it. 
Another possible approach would be to add new property in the class filling the grid. In its definition in the get-method you can return the result from the converter. 
I hope that helps.

Kind regards,
Maya
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Ph?m H?ng Van
Top achievements
Rank 1
answered on 24 Jul 2010, 03:27 AM
Thanks so much !
Your sample  project is very interesting.
But I haven't solved my problem. My project 's approach  : MVVM and RIA Services. I created GenderEnum property in project silverlight (client) :

Partial Public Class Employee

       ...







        Public ReadOnly Property GenderEnum() As String
            Get
                If Gender = 0 Then
                    Return EnumResource.Gender_Male
                ElseIf Gender = 1 Then
                    Return EnumResource.Gender_Female
                Return ""
            End Get
        End Property

     
        Private Sub OnGenderChanging(ByVal value As Integer?)
            If Me.EntityState <> System.ServiceModel.DomainServices.Client.EntityState.Detached Then
                OnPropertyChanged(New PropertyChangedEventArgs("GenderEnum"))
            End If
       End Sub

...










    End Class

After, I binding GridViewDataColumn with GenderEnum property. It shows in gridview well. But when I sort or group this column -> has an exception : "Load operation failed for query 'GetEmployee...'.No propery or field 'GenderEnum' exists in type Employee" .
So I have to use the converter and have problem like my first question. "Gender" is an example and my database have many fields like it.

Please help me.
Thanks.


0
Maya
Telerik team
answered on 29 Jul 2010, 10:19 AM
Hi van pham hong,

In this case you can create partial class, expose a new property - Gender in your case and then bind it to the column you want.  
For example:

namespace Converters_RIA.Web
{
    public partial class Employee
    {      
        public string Manager
        {
            get
            {
                if(this.ReportsTo == 2)
                {
                    return "John";
                }
                else
                {
                    return "Peter";
                }              
            }          
        }
    }
}

<telerik:RadGridView x:Name="RadGridView1" AutoGenerateColumns="False" ItemsSource="{Binding Employees}" >
  <telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Manager}" />
  </telerik:RadGridView.Columns>

I am sending you a sample project illustrating the proposed solution. 


Regards,
Maya
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Ph?m H?ng Van
Top achievements
Rank 1
answered on 06 Aug 2010, 06:43 PM
Thanks!
I'm sorry because that question is not clear.
So i created a sample project, download here .
I added a field Gender into table "Employee" in Northwind database.
My code :
Imports TelerikGridView.My.Resources
Partial Public Class Employees
    Public ReadOnly Property GenderEnum() As String
        Get
            Return If(Gender, EnumResource.Female, EnumResource.Male)
        End Get
    End Property
End Class
<telerikGridView:RadGridView x:Name="grdEmployee"                                   
                                       ShowGroupPanel="True"
                                       RowIndicatorVisibility="Collapsed"
                                       IsBusy="{Binding IsLoading}"
                                        AutoGenerateColumns="False"
                                        ItemsSource="{Binding Data}"                                        
                                        SelectedItem="{Binding SelectedItem, Mode= TwoWay}"
                                        CurrentItem="{Binding SelectedItem, Mode= TwoWay}"
                                        ShowColumnFooters="True"                                         
                                        IsReadOnly="True" >
               <telerikGridView:RadGridView.Columns>
                   <telerikGridView:GridViewDataColumn  DataMemberBinding="{Binding FirstName}"
                       Header="First name" HeaderTextAlignment= "Center" />
                     <telerikGridView:GridViewDataColumn  DataMemberBinding="{Binding LastName}"
                       Header="Last name" HeaderTextAlignment= "Center" />
                  
                   <telerikGridView:GridViewDataColumn DataMemberBinding="{Binding BirthDate}"
                                                      Header="Birth date" HeaderTextAlignment= "Center"
                                                       DataFormatString="{} {0:MM/dd/yyyy}"
                                                       TextAlignment="Center" >
                                                        
                   </telerikGridView:GridViewDataColumn>
                   <telerikGridView:GridViewDataColumn DataMemberBinding="{Binding GenderEnum}"
                                      Header="Gender" HeaderTextAlignment= "Center" >
                   </telerikGridView:GridViewDataColumn>                   
               </telerikGridView:RadGridView.Columns>
 
           </telerikGridView:RadGridView>
Partial Public Class Home
    Inherits Page
    Private m_VMEmployee As New VMEmployee
 
    Public Sub New()
        InitializeComponent()
        m_VMEmployee = TryCast(Me.DataContext, VMEmployee)
        If (m_VMEmployee IsNot Nothing) Then
            m_VMEmployee.MasterDataType = DataType.Employee
        End If
        Me.Title = ApplicationStrings.HomePageTitle
    End Sub
 
    Private Sub Home_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        m_VMEmployee.LoadData()
    End Sub
End Class

VMEmployee
? You can see it in my project. I use this way because i want to support multilanguage by using Resources.
But Sorting, Grouping and Filtering Gender column -> work not well.
I hope you help me.
Thanks so much.
0
Maya
Telerik team
answered on 12 Aug 2010, 08:53 AM
Hello van pham hong,

Firstly, let me clear that out. You want to change the field Gender depending on the language you are setting. So, for example, if the chosen language is Spanish, you require the value to be Mujer/Hombre. When you change it to French - Femme/Homme accordingly. 
If that is the case, you can follow up the same idea as in the project I have attached previously. However, if your Property Gender is Female/Male, you can use the logic of changing the language as a boolean property and apply it as follows:

public string Gender
        {
            get
            {
                if(isSpanish)
                {
                    return ES.Female;
                     
                }
                else if(isFrench)
                {
                    return FR.Female;                  
                }              
            }          
        }

You can apply here whatever logic you need to implement.FR and ES are your custom Resource files for the different languages.

 

Best wishes,
Maya
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Tags
GridView
Asked by
Ph?m H?ng Van
Top achievements
Rank 1
Answers by
Maya
Telerik team
Ph?m H?ng Van
Top achievements
Rank 1
Share this question
or