GridView Custom Add / Edit / Delete by Open RIA Service

2 posts, 0 answers
  1. Anand
    Anand avatar
    12 posts
    Member since:
    Apr 2014

    Posted 11 Nov 2014 Link to this post

    I have a RadGridView which is Dynamically Build with the help of 
    http://blogs.telerik.com/vladimirenchev/posts/11-09-28/dynamic-binding-for-your-silverlight-applications.aspx
    http://www.telerik.com/forums/rowdetailstemplate-binding-with-dynamic-data
    http://technobelities.blogspot.in/2013/03/dynamic-property-or-extended-property.html

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Dynamic;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Linq;
    using Delasoft.Hpm.Infrastructure.Util.Const;
      
    namespace Delasoft.Hpm.Infrastructure.Models
    {
        public class DataRow :DynamicObject , INotifyPropertyChanged
        {
            public IDictionary<string, object> data;
            private string DVL_URL = "http://delasoft.com";
            public DataRow()
            {
                data=new Dictionary<string,object>();
            }
      
            public DataRow(IDictionary<string, object> data)
            {
                var a = data["Routeid"];
                string dvlUrl = ProjectConstant.DVL_URL + "BegMp=" + data["BegMp"].ToString() + "routeid=" + data["Routeid"].ToString();
                data["Dvlurl"] = dvlUrl;
                this.data = data;
                this.data.OrderBy(x => x.Key);
            }
      
            public DataRow(IDictionary<string, object> data1,IDictionary<string, object> data2)
            {
      
                this.data = data1.Union(data2).ToDictionary(k => k.Key, v => v.Value);
                string dvlUrl = ProjectConstant.DVL_URL + "BegMp=" + data["BegMp"].ToString() + "routeid=" + data["Routeid"].ToString();
                data["Dvlurl"] = dvlUrl;
                this.data.OrderBy(x => x.Key);
            }
      
            public DataRow(IDictionary<string, object> data1, IDictionary<string, object> data2, IDictionary<string, object> data3)
            {
      
                this.data = data1.Union(data2).ToDictionary(k => k.Key, v => v.Value).Union(data3).ToDictionary(k => k.Key, v => v.Value);
                string dvlUrl = ProjectConstant.DVL_URL + "BegMp=" + data["BegMp"].ToString() + "routeid=" + data["Routeid"].ToString();
                data["Dvlurl"] = dvlUrl;
                this.data.OrderBy(x => x.Key);
            }
      
            public override IEnumerable<string> GetDynamicMemberNames()
            {
                //return base.GetDynamicMemberNames();
                return data.Keys;
            }
      
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                //return base.TryGetMember(binder, out result);
                result= this[binder.Name];
                return true;
            }
      
            public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                //return base.TrySetMember(binder, value);
                this[binder.Name] = value;
                return true;
            }
      
            private void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
      
      
            public object this[string columnName]
            {
                get
                {
                    if (data.ContainsKey(columnName))
                    {
                        return data[columnName];
                    }
      
                    return null;
                }
                set
                {
                    if (!data.ContainsKey(columnName))
                    {
                        data.Add(columnName, value);
      
                        OnPropertyChanged(columnName);
                    }
                    else
                    {
                        if (data[columnName] != value)
                        {
                            data[columnName] = value;
      
                            OnPropertyChanged(columnName);
                        }
                    }
                }
            }
            #region INotifyPropertyChanged Members
      
            public event PropertyChangedEventHandler PropertyChanged;
      
            #endregion
        }
    }

    My Xaml code is like this :

    <StackPanel Grid.Column="0" Grid.Row="0" Orientation="Horizontal">
                                    <telerik:RadButton Content="Save Edit / Update"
                                                   HorizontalAlignment="Left"
                                                   VerticalAlignment="Center" Margin="5,0"
                                                   Command="telerikGrid:RadGridViewCommands.CommitEdit"
                                                   CommandTarget="{Binding ElementName=DictRouteGridView}"/>
                                    <telerik:RadButton Content="Cancel Edit / Update"
                                                   HorizontalAlignment="Left"
                                                   VerticalAlignment="Center" Margin="5,0"
                                                   Command="telerikGrid:RadGridViewCommands.CancelRowEdit"
                                                   CommandTarget="{Binding ElementName=DictRouteGridView}" />
     
    <telerik:RadGridView Grid.Row="1" x:Name="DictRouteGridView"
                                                     ItemsSource="{Binding RoutesGridData}"
                                                     SelectionMode="Extended"
                                                     IsSynchronizedWithCurrentItem="true"
                                                     SelectedItem="{Binding SelectedDataRowsItem,Mode=TwoWay}"
                                                     behaviour:RadGridSelectedItemsBindingBehavior.SelectedItems="{Binding SelectedDataRowsItems}">
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="RowEditEnded">
                                            <i:InvokeCommandAction Command="{Binding  EditGridRowCommand}" CommandParameter="{Binding ElementName=DictRouteGridView, Path=SelectedItem }"></i:InvokeCommandAction>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>                                                                                    
                                </telerik:RadGridView>


    My View Model Loads RoutesGridData is an observable Collection which loaded Via Open RIA Domain Service. I also have  ICommand EditGridRowCommand in my ViewModel.

    I m not getting How I can get the Edited Data in my ViewModel. I tried in 2 way
    1.  By running Custom Commands for Add New Row / Update Row / The top 2 Button 
    http://demos.telerik.com/silverlight/#GridView/Commands
    they works But I m not getting how I can capture this Edited / Added Data in ViewModel & can send to Open RIA Domain Service for making changes In db.

    2. I Tried with EventTrigger for RowEditEnded but I m not getting latest Updated Data so I can process It.

    Any Help? 

    Extra Request:

    As you see My DataRow is of IDictionary which I build by Join of Few tables mapped in Linq. so Keys are the name of Column & Value is the data of that Property. Now These Database Column Name are dirty I want to change the Key with Display Names How to do?



  2. Yoan
    Admin
    Yoan avatar
    1070 posts

    Posted 13 Nov 2014 Link to this post

    Hi Anand,

    I would suggest you to use the DomainDataSource for OpenRIA services. Then you can use its SubmitChangesCommand command in order to save the changes. The changes will be populated on a server when SubmitChangesCommand is executed. You can also check this blog post for a reference.

    Regards,
    Yoan
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
  3. DevCraft banner
Back to Top