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

GridView Custom Add / Edit / Delete by Open RIA Service

1 Answer 60 Views
GridView
This is a migrated thread and some comments may be shown as answers.
Anand
Top achievements
Rank 1
Anand asked on 11 Nov 2014, 05:27 PM
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?



1 Answer, 1 is accepted

Sort by
0
Yoan
Telerik team
answered on 13 Nov 2014, 04:25 PM
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.

 
Tags
GridView
Asked by
Anand
Top achievements
Rank 1
Answers by
Yoan
Telerik team
Share this question
or