Hello all,
I'm use the RadGrid in WebServerControl and I'm have a problem with the event of "SelectedIndexChanged" with "AllowFilteringByColumn = true;"
When I'm selected a row after use filters, the grid is rebind and my filter is loosed.
The value of "SelectedValue" doesn't match with my selection and the grid is reinitialised.
My Code:
WebServerControl:
WebPart who's use it :
I'm use the RadGrid in WebServerControl and I'm have a problem with the event of "SelectedIndexChanged" with "AllowFilteringByColumn = true;"
This is the declaration code for my RadGrid :
var Grid = new RadGrid { AllowFilteringByColumn = true, AllowPaging = true, AllowSorting = true, ShowStatusBar = true, ShowHeader = true, GridLines = GridLines.None, PageSize = PageSize, EnableViewState = true, ID = string.Format("{0}_Grid", ID) };When I'm selected a row after use filters, the grid is rebind and my filter is loosed.
The value of "SelectedValue" doesn't match with my selection and the grid is reinitialised.
My Code:
WebServerControl:
public class CustomRadGrid : WebControl, INamingContainer{ protected RadAjaxManager AjaxManager; protected RadAjaxLoadingPanel AjaxLoadingPanel; protected RadGrid Grid; protected ObjectDataSource ObjDataSource; #region PROPERTIES public string SelectCountMethod; public string SelectMethod; public string MaximumRowsParameterName; public string StartRowIndexParameterName; public string DataObjectTypeName; public List<KeyValuePair<string, string>> SelectParameters; /// <summary> /// Display columns in gridview /// </summary> /// <value> /// Key = ColumnName /// Value = DiplayName, Type of the column ToString() /// </value> public List<KeyValuePair<string, KeyValuePair<string, Type>>> DisplayColumns; /// <summary> /// Data Key Names uses in Master Table View /// </summary> public string[] DataKeyNames; /// <summary> /// If you want use external DataSource, set this DataSourceID /// </summary> public string DataSourceID; /// <summary> /// Set this for initialize a control to refresh after row selection /// </summary> public string ControlIDToRefresh { private get; set; } /// <summary> /// Gets or sets the size of the page. /// </summary> /// <value> /// The size of the page. /// </value> private int _pageSize; public int PageSize { get { return (Grid != null) ? Grid.PageSize : _pageSize; } set { _pageSize = value; if (Grid != null) { Grid.PageSize = _pageSize; } } } /// <summary> /// Gets the index of the current page. /// </summary> /// <value> /// The index of the current page. /// </value> public int CurrentPageIndex { get { EnsureChildControls(); return (Grid != null) ? Grid.CurrentPageIndex : 0; } } /// <summary> /// Gets the selected value. /// </summary> private string _selectedValue; public string SelectedValue { get { return string.IsNullOrEmpty(_selectedValue) ? "" : _selectedValue; } } /// <summary> /// Save grid settings /// </summary> private string _settings; #endregion PROPERTIES /// <summary> /// Initializes a new instance of the <see cref="CustomRadGrid"/> class. /// </summary> public CustomRadGrid() { PageSize = 20; DataSourceID = ""; } /// <summary> /// Gets a <see cref="T:System.Web.UI.ControlCollection"/> object that represents the child controls for a specified server control in the UI hierarchy. /// </summary> /// <returns> /// The collection of child controls for the specified server control. /// </returns> public override ControlCollection Controls { get { EnsureChildControls(); return base.Controls; } } /// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load"/> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs"/> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); #region DataSource if (string.IsNullOrEmpty(DataSourceID)) { ObjDataSource = new ObjectDataSource { //EnablePaging = true, TypeName = "BLL.BL", ID = string.Format("{0}_ObjDataSource", ID), SelectMethod = SelectMethod, SelectCountMethod = SelectCountMethod }; if (!string.IsNullOrEmpty(MaximumRowsParameterName)) ObjDataSource.MaximumRowsParameterName = MaximumRowsParameterName; if (!string.IsNullOrEmpty(StartRowIndexParameterName)) ObjDataSource.StartRowIndexParameterName = StartRowIndexParameterName; ObjDataSource.Selecting += ObjDataSourceSelecting; foreach (var selectParameter in SelectParameters) { ObjDataSource.SelectParameters.Add(selectParameter.Key, selectParameter.Value); } Controls.Add(ObjDataSource); } #endregion DataSource #region GRID Grid = new RadGrid { AllowFilteringByColumn = true, AllowPaging = true, AllowSorting = true, ShowStatusBar = true, ShowHeader = true, GridLines = GridLines.None, PageSize = PageSize, EnableViewState = true, ID = string.Format("{0}_Grid", ID) }; if (DisplayColumns == null || DisplayColumns.Count == 0) { Grid.MasterTableView.AutoGenerateColumns = Grid.AutoGenerateColumns = true; } else { Grid.MasterTableView.AutoGenerateColumns = Grid.AutoGenerateColumns = false; foreach (var displayColumn in DisplayColumns) { Grid.MasterTableView.Columns.Add(new GridBoundColumn { UniqueName = displayColumn.Key, DataField = displayColumn.Key, DataType = displayColumn.Value.Value, HeaderText = displayColumn.Value.Key, DataFormatString = displayColumn.Value.Value == typeof(DateTime) ? "{0:d}" : "{0}" }); } } Grid.ClientSettings.EnableRowHoverStyle = true; Grid.ClientSettings.EnableAlternatingItems = true; Grid.ClientSettings.EnablePostBackOnRowClick = true; Grid.ClientSettings.Selecting.AllowRowSelect = true; Grid.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.Top; Grid.MasterTableView.CommandItemSettings.ShowRefreshButton = false; Grid.MasterTableView.CommandItemSettings.ShowAddNewRecordButton = false; Grid.MasterTableView.CommandItemSettings.ShowExportToExcelButton = true; Grid.MasterTableView.PagerStyle.AlwaysVisible = true; //Select the DataSource if (string.IsNullOrEmpty(DataSourceID) && ObjDataSource != null) { Grid.DataSourceID = ObjDataSource.ID; } else if (ObjDataSource == null && !string.IsNullOrEmpty(DataSourceID)) { Grid.DataSourceID = DataSourceID; } else { Grid.NeedDataSource += OnNeedDataSource; } //Initialise DataKeys if (DataKeyNames != null && DataKeyNames.Count() > 0) { Grid.MasterTableView.DataKeyNames = DataKeyNames; } //Grid events //Grid.Init += GridInit; Grid.ItemCommand += GridItemCommand; Grid.ItemCreated += GridItemCreated; Grid.SelectedIndexChanged += GridSelectedIndexChanged; Controls.Add(Grid); #endregion GRID #region AJAX //Initialise Ajax Manager AjaxLoadingPanel = new RadAjaxLoadingPanel { InitialDelayTime = 1, MinDisplayTime = 200, ID = string.Format("{0}_AjaxLoadingPanel", ID) }; Controls.Add(AjaxLoadingPanel); AjaxManager = RadAjaxManager.GetCurrent(Page); if (AjaxManager == null) { AjaxManager = new RadAjaxManager { ID = string.Format("{0}_AjaxManager", ID), DefaultLoadingPanelID = AjaxLoadingPanel.ID, EnableAJAX = true }; Controls.Add(AjaxManager); Page.Items.Add(typeof(RadAjaxManager), AjaxManager); } //Set Ajax Settings: if (!string.IsNullOrEmpty(ControlIDToRefresh)) { var ajaxSetting = new AjaxSetting(Grid.ID); ajaxSetting.UpdatedControls.Add(new AjaxUpdatedControl(ControlIDToRefresh, AjaxLoadingPanel.ID)); ajaxSetting.EventName = "OnRowSelected"; AjaxManager.AjaxSettings.Add(ajaxSetting); } AjaxManager.AjaxSettings.AddAjaxSetting(Grid, Grid, AjaxLoadingPanel, UpdatePanelRenderMode.Inline); //To export in Excel: if (!Page.ClientScript.IsStartupScriptRegistered(GetType(), string.Format("{0}_onRequestStart", ID))) { var onRequestStart = string.Format("function {0}_onRequestStart(ajaxManager, eventArgs){{if(eventArgs.EventTarget.indexOf('ExportToExcelButton') != -1){{eventArgs.EnableAjax = false;}}}}", ID); Page.ClientScript.RegisterStartupScript(GetType(), string.Format("{0}_onRequestStart", ID), onRequestStart, true); AjaxManager.ClientEvents.OnRequestStart = string.Format("{0}_onRequestStart", ID); } #endregion AJAX } /// <summary> /// Grids the init. /// Reduce the set of filter functions so that the filter menu can only show the NoFilter, Contains, EqualTo, GreaterThan and LessThan items /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> void GridInit(object sender, EventArgs e) { var menu = Grid.FilterMenu; var i = 0; while (i < menu.Items.Count) { if (menu.Items[i].Text == "NoFilter" || menu.Items[i].Text == "Contains" || menu.Items[i].Text == "EqualTo" || menu.Items[i].Text == "GreaterThan" || menu.Items[i].Text == "LessThan") { i++; } else { menu.Items.RemoveAt(i); } } } #region GRID EVENTS /// <summary> /// Delegate to attach method on SelectedIndexChanged /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> public delegate void SelectedIndexChangedHandler(object sender, EventArgs e); /// <summary> /// Occurs when [selected index changed]. /// </summary> [Category("Configuration"), Browsable(true), Description("Evènement associé au gridview")] public event SelectedIndexChangedHandler SelectedIndexChanged; /// <summary> /// Grids the selected index changed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> void GridSelectedIndexChanged(object sender, EventArgs e) { _selectedValue = (string)(Grid.SelectedValue ?? ""); if (SelectedIndexChanged != null) SelectedIndexChanged(this, e); } /// <summary> /// Delegate to attach method on NeedDataSource /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> public delegate void NeedDataSourceHandler(object sender, EventArgs e); /// <summary> /// Occurs when [need data source]. /// </summary> [Category("Configuration"), Browsable(true), Description("Evènement associé au gridview")] public event NeedDataSourceHandler NeedDataSource; /// <summary> /// Called when [need data source]. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="Telerik.Web.UI.GridNeedDataSourceEventArgs"/> instance containing the event data.</param> void OnNeedDataSource(object sender, GridNeedDataSourceEventArgs e) { if (NeedDataSource != null) { NeedDataSource(this, e); } else if (string.IsNullOrEmpty(DataSourceID)) { Grid.DataSource = ObjDataSource; } } #endregion GRID EVENTS #region EXPORT /// <summary> /// To know if exporting /// </summary> bool _isExport = false; /// <summary> /// Grids the item created. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="Telerik.Web.UI.GridItemEventArgs"/> instance containing the event data.</param> void GridItemCreated(object sender, GridItemEventArgs e) { //Remove the filter line when exporting data if (e.Item is GridFilteringItem && _isExport) e.Item.Visible = false; } /// <summary> /// Grids the item command. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="Telerik.Web.UI.GridCommandEventArgs"/> instance containing the event data.</param> private void GridItemCommand(object sender, GridCommandEventArgs e) { if (e.CommandName == RadGrid.ExportToExcelCommandName || e.CommandName == RadGrid.ExportToWordCommandName || e.CommandName == RadGrid.ExportToCsvCommandName) { Grid.ExportSettings.OpenInNewWindow = true; Grid.ExportSettings.ExportOnlyData = true; Grid.ExportSettings.IgnorePaging = true; Grid.ExportSettings.Excel.Format = GridExcelExportFormat.Html; Grid.ExportSettings.FileName = string.Format("[{0}]Export", DateTime.Now.ToString("yyyyMMdd_HHmm")); _isExport = true; } } #endregion EXPORT #region DATASOURCE /// <value> /// The data source. /// </value> public object DataSource { set { EnsureChildControls(); Grid.DataSource = value; } } /// <summary> /// Objs the data source selecting. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs"/> instance containing the event data.</param> private void ObjDataSourceSelecting(object sender, ObjectDataSourceSelectingEventArgs e) { if (SelectParameters != null) { ObjDataSource.SelectParameters.Clear(); if (!e.ExecutingSelectCount && SelectParameters.Count != 0) { foreach (var selectParameter in SelectParameters) { ObjDataSource.SelectParameters.Add(selectParameter.Key, selectParameter.Value); } } } } #endregion DATASOURCE}WebPart who's use it :
public class DIList : Abstract.BaseAjaxWebpart { protected GridViewDI DIs; protected EditDI DIEdit; protected override void OnLoad(EventArgs e) { base.OnLoad(e); DIEdit = new EditDI { ID = string.Format("{0}_DIEdit", this.ID) }; Controls.Add(DIEdit); DIs = new GridViewDI { ID = string.Format("{0}_DIList", this.ID), ControlIDToRefresh = DIEdit.ID }; Controls.AddAt(0, DIs); DIs.SelectedIndexChanged += DIListSelectedIndexChanged; } void DIListSelectedIndexChanged(object sender, EventArgs e) { DIEdit.idDIValue = DIs.SelectedValue; } }