I am using Silverlight 4.0 Telerik Rad Grid in one of my applications.
I am binding the Grid with System.Collections.Generic.List<MyClass>
When I Select Add/Delete from Right Click on the Grid, It does not work. Edit is working as expected. I am getting the editted objects in the Save event.
What I want to achieve is :
- When User Selects "Add" then a New Row should be added to the Grid. The entries made to Newly added rows should be accessible in Save event the form of objects of List<>. So that these rows can be saved in to database. Here User can click on "Add" and number of times. I want to achieve the same on "Add New Row" button click also
- When User Selects "Delete" then selected row should be deleted. In Save event that particular object should not be visible in the List<>.
I have coded as adviced in demos and documentation but with below code I am unable to meet the requirements.
#region Namespaces
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView;
using Telerik.Windows;
using System.IO;
using System.Xml.Linq;
using System.Windows.Data;
using System.Globalization;
using System.Collections;
#endregion
/// <summary>
///
/// </summary>
public partial class uctrlAddUpdateGrid : UserControl
{
/// <summary>
///
/// </summary>
/// <param name="pstrSelectedProgram"></param>
public uctrlAddUpdateGrid(string pstrSelectedProgram)
{
InitializeComponent();
this.BindDataGrid(pstrSelectedProgram);
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RadContextMenu_ItemClick(object sender, RadRoutedEventArgs e)
{
RadContextMenu menu = (RadContextMenu)sender;
RadMenuItem clickedItem = e.OriginalSource as RadMenuItem;
GridViewRow row = menu.GetClickedElement<GridViewRow>();
if (clickedItem != null && row != null)
{
string header = Convert.ToString(clickedItem.Header);
switch (header)
{
case "Add":
this.AddNewRow();
break;
case "Edit":
radGridView1.BeginEdit();
break;
case "Delete":
radGridView1.Items.Remove(row.DataContext);
break;
default:
break;
}
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RadContextMenu_Opened(object sender, RoutedEventArgs e)
{
RadContextMenu menu = (RadContextMenu)sender;
GridViewRow row = menu.GetClickedElement<GridViewRow>();
if (row != null)
{
row.IsSelected = row.IsCurrent = true;
GridViewCell cell = menu.GetClickedElement<GridViewCell>();
if (cell != null)
{
cell.IsCurrent = true;
}
}
else
{
menu.IsOpen = false;
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExporttoExcel_Click(object sender, RoutedEventArgs e)
{
string extension = "";
ExportFormat format = ExportFormat.Html;
extension = "xls";
format = ExportFormat.Html;
SaveFileDialog dialog = new SaveFileDialog();
dialog.DefaultExt = extension;
dialog.Filter = String.Format("{1} files (*.{0})|*.{0}|All files (*.*)|*.*", extension, "Excel");
dialog.FilterIndex = 1;
if (dialog.ShowDialog() == true)
{
using (Stream stream = dialog.OpenFile())
{
GridViewExportOptions exportOptions = new GridViewExportOptions();
exportOptions.Format = format;
exportOptions.ShowColumnFooters = true;
exportOptions.ShowColumnHeaders = true;
exportOptions.ShowGroupFooters = true;
radGridView1.Export(stream, exportOptions);
}
}
MessageBox.Show("Export to Excel is under construction.");
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddNewRow_Click(object sender, RoutedEventArgs e)
{
this.AddNewRow();
}
/// <summary>
///
/// </summary>
private void AddNewRow()
{
radGridView1.BeginInsert();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSaveInsertEdit_Click(object sender, RoutedEventArgs e)
{
int lintRows = 0;
IEnumerable<ComboItemsCollections> lIEnumModifiedRows;
lIEnumModifiedRows = ((System.Collections.Generic.IEnumerable<ComboItemsCollections>)radGridView1.ItemsSource).Where(c => c.IsRowModified == "Y");
foreach (ComboItemsCollections obj in lIEnumModifiedRows)
{
if (obj.IsRowModified == "Y")
{
obj.IsRowModified = "N";
lintRows++;
}
}
MessageBox.Show(lintRows.ToString() + " Rows got modified in the Data Grid.");
MessageBox.Show("Save Insert Edit is under construction.");
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCancelInsertEdit_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Cancel Insert Edit is under construction.");
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RadGridView1_ElementExporting(object sender, GridViewElementExportingEventArgs e)
{
if (e.Element == ExportElement.HeaderRow || e.Element == ExportElement.FooterRow
|| e.Element == ExportElement.GroupFooterRow)
{
e.FontSize = 10;
e.FontWeight = FontWeights.Bold;
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void radGridView1_RowEditEnded(object sender, GridViewRowEditEndedEventArgs e)
{
((ComboItemsCollections)(((sender as RadGridView).CurrentCell as GridViewCell).ParentRow.DataContext)).IsRowModified = "Y";
if (e.EditOperationType == GridViewEditOperationType.Insert)
{
((System.Collections.Generic.IEnumerable<ComboItemsCollections>)radGridView1.ItemsSource).ToList().Add((ComboItemsCollections)e.NewData);
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void radGridView1_AddingNewDataItem(object sender, GridViewAddingNewEventArgs e)
{
e.NewObject = new ComboItemsCollections();
}
/// <summary>
///
/// </summary>
/// <param name="pstrSelectedProgram"></param>
private void BindDataGrid(string pstrSelectedProgram)
{
List<ComboItemsCollections> llstCmbItemColl;
ComboItemsCollections lobjCmbItemColl;
llstCmbItemColl = new List<ComboItemsCollections>();
try
{
for (int i = 0; i < 100000; i++)
{
lobjCmbItemColl = new ComboItemsCollections();
if (i % 10000 == 0)
{
lobjCmbItemColl.Program = "Program - 1";
}
else if (i % 10000 == 1)
{
lobjCmbItemColl.Program = "Program - 2";
}
else
{
lobjCmbItemColl.Program = "";
}
lobjCmbItemColl.FirstName = "First Name_" + (i + 1).ToString();
lobjCmbItemColl.MiddleName = "Middle Name_" + (i + 1).ToString();
lobjCmbItemColl.LastName = "Last Name_" + (i + 1).ToString();
lobjCmbItemColl.Country = "Country_" + (i + 1).ToString();
lobjCmbItemColl.IsRowModified = "N";
llstCmbItemColl.Add(lobjCmbItemColl);
}
radGridView1.ItemsSource = llstCmbItemColl.Where(c => c.Program == pstrSelectedProgram);
}
catch (Exception ex)
{
}
finally
{
lobjCmbItemColl = null;
llstCmbItemColl = null;
}
}
}
/// <summary>
///
/// </summary>
public class ComboItemsCollections
{
#region Variables
string pstrFirstName;
string pstrMiddleName;
string pstrLastName;
string pstrCountry;
string pstrIsRowModified;
#endregion
/// <summary>
///
/// </summary>
public ComboItemsCollections()
{
pstrFirstName = string.Empty;
pstrMiddleName = string.Empty;
pstrLastName = string.Empty;
pstrCountry = string.Empty;
pstrIsRowModified =string.Empty;
}
#region Properties
public string FirstName
{
get { return pstrFirstName; }
set { pstrFirstName = value; }
}
public string MiddleName
{
get { return pstrMiddleName; }
set { pstrMiddleName = value; }
}
public string LastName
{
get { return pstrLastName; }
set { pstrLastName = value; }
}
public string Country
{
get { return pstrCountry; }
set { pstrCountry = value; }
}
public string IsRowModified
{
get { return pstrIsRowModified; }
set { pstrIsRowModified = value; }
}
#endregion
}
<StackPanel Orientation="Horizontal" Margin="10,10,0,0">
<Button FontFamily="Arial" Content="Export to Excel" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="btnExporttoExcel" VerticalAlignment="Center" Click="btnExporttoExcel_Click" Width="100" />
<Button FontFamily="Arial" Content="Add New Row" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="btnAddNewRow" VerticalAlignment="Center" Click="btnAddNewRow_Click" Width="100" Margin="10,0,0,0"/>
<Button FontFamily="Arial" Content="Save insert/edit" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="btnSaveInsertEdit" VerticalAlignment="Center" Click="btnSaveInsertEdit_Click" Width="100" Margin="10,0,0,0"/>
<Button FontFamily="Arial" Content="Cancel insert/edit" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="btnCancelInsertEdit" VerticalAlignment="Center" Click="btnCancelInsertEdit_Click" Width="100" Margin="10,0,0,0"/>
</StackPanel>
<Border telerikQuickStart:ThemeAwareBackgroundBehavior.IsEnabled="True" />
<telerik:RadGridView FrozenColumnCount="5" FontFamily="Arial" AutoGenerateColumns="False" HorizontalAlignment="Left" Name="radGridView1" VerticalAlignment="Top" Height="380" CanUserDeleteRows="True" Margin="10,10,0,0" RowEditEnded="radGridView1_RowEditEnded" AddingNewDataItem="radGridView1_AddingNewDataItem">
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu Opened="RadContextMenu_Opened" ItemClick="RadContextMenu_ItemClick">
<telerik:RadContextMenu.Items>
<telerik:RadMenuItem Header="Add" />
<telerik:RadMenuItem Header="Edit" />
<telerik:RadMenuItem Header="Delete" />
</telerik:RadContextMenu.Items>
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
<telerik:RadGridView.Columns>
<telerik:GridViewColumn>
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<telerik:RadButton Content="-" CommandParameter="{Binding}"/>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="First Name"></telerik:GridViewDataColumn>
<telerik:GridViewDataColumn DataMemberBinding="{Binding MiddleName}" Header="Middle Name"></telerik:GridViewDataColumn>
<telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="Last Name"></telerik:GridViewDataColumn>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Country}" Header="Country"></telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
Please let me know how to proceed.
Thanks in advance
Kalyan Gupta