Ok-
Can anyone give me any insight into how the DynamicRadGrid Column Filters work? Here is the scenario.
I am using DynamicData and the Telerik.Web.UI.DynamicRadGrid.
I have created a custom class that inherits from ITemplate. My Custom Template Class builds a RadComboBox using the MetaForeignKeyColumn passed to it. In the Template Class I have also subscribed to the ComboBox.selectedIndexChanged Event and fire the Filter event passin a new Pair that contains the columnname and value to filter on.
/// <summary>/// Summary description for ForeignKeyFilterTemplate/// </summary>public class DDForeignKeyFilterTemplate : ITemplate{ private MetaForeignKeyColumn _column; private RadComboBox _ddlb = new RadComboBox(); private const string NullValueString = "[null]"; private DSIWebDbDataContext _context; private string _filterColumnName = string.Empty; public DDForeignKeyFilterTemplate(MetaForeignKeyColumn MetaColumn) { _column = MetaColumn; _ddlb.Skin = "WebBlue"; _ddlb.EnableViewState = true; _ddlb.AutoPostBack = true; _ddlb.AllowCustomText = false; _filterColumnName = _column.ForeignKeyNames[0]; } #region ITemplate Members public void InstantiateIn(Control container) { _ddlb.SelectedIndexChanged += new RadComboBoxSelectedIndexChangedEventHandler(_ddlb_SelectedIndexChanged); if (_ddlb.Items.Count <= 0) { if (!_column.IsRequired) _ddlb.Items.Add(new RadComboBoxItem("[Not Set]")); PopulateListControl(); } container.Controls.Add(_ddlb); } void _ddlb_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e) { ((GridFilteringItem)(((RadComboBox)sender).Parent.Parent)).FireCommandEvent("Filter", new Pair(e.Text, _column.Name)); } private void PopulateListControl() { _context = (DSIWebDbDataContext)_column.Table.CreateContext(); string PrimaryKeyName = _column.ParentTable.PrimaryKeyColumns[0].Name; string DispalyColumnName = _column.ParentTable.DisplayColumn.Name;; string ParentTableName = _column.ParentTable.Name; _ddlb.DataValueField = PrimaryKeyName; _ddlb.DataTextField = DispalyColumnName; switch (ParentTableName) { case "Bookings": loadBookings(); break; case "SiteLocations": loadSiteLocations(); break; case "ContainerSizes": loadContainerSize(); break; case "Drivers": loadDrivers(); break; case "Carriers": loadCarriers(); break; case "YardPositions": loadYardPositions(); break; case "ContainerTypes": loadContainerTypes(); break; } } private void loadBookings() { var results = _context.Bookings.Select(b => new idname() { id = b.booking_key.ToString(), name = b.Booking_Number }); results.OrderBy(o => o.name); if (results.Count() > 0) { foreach (var item in results) { _ddlb.Items.Add(new RadComboBoxItem(item.name, item.id)); } } } private void loadSiteLocations() { var results = _context.SiteLocations.Select(b => new idname() { id = b.ref_key.ToString(), name = b.Location }); results.OrderBy(o => o.name); if (results.Count() > 0) { foreach (var item in results) { _ddlb.Items.Add(new RadComboBoxItem(item.name, item.id)); } } }
In the DynamicRadGrid Init Method I am creating a new instance of my Template Class and assigning it to the DynamicGridBoundColumn.FilterTemplate.
DynamicGridBoundColumn gridColumn = new DynamicGridBoundColumn();string fieldName = string.Empty;string fieldAlias = string.Empty;gridColumn.DataField = column.Name;gridColumn.ConvertEmptyStringToNull = column.ConvertEmptyStringToNull;gridColumn.DataFormatString = column.DataFormatString;gridColumn.UIHint = column.UIHint;gridColumn.HtmlEncode = column.HtmlEncode;gridColumn.NullDisplayText = column.NullDisplayText;gridColumn.ApplyFormatInEditMode = column.ApplyFormatInEditMode;gridColumn.HeaderText = column.DisplayName.Replace("_"," ");gridColumn.Resizable = true;fieldAlias = column.DisplayName;fieldAlias = fieldAlias.Replace("_", "");//Set up grouping for ForeignKeyColumnsif (column is MetaForeignKeyColumn){ fieldName = ((MetaForeignKeyColumn)column).ForeignKeyNames[0]; gridColumn.FilterTemplate = new DDForeignKeyFilterTemplate(((MetaForeignKeyColumn)column)); gridColumn.FilterListOptions = GridFilterListOptions.VaryByDataTypeAllowCustom;}else{ fieldName = column.Name; fieldAlias = column.DisplayName; gridColumn.FilterListOptions = GridFilterListOptions.VaryByDataType;}// Country [Country], count(Country) Items [Items] Group By CountrygridColumn.GroupByExpression = fieldName + " [" + fieldAlias + "], count(" + fieldName + ") Items [Items] Group By " + fieldName;MasterTableView.Columns.Add(gridColumn);This works great and I get the RadComboBox boxes with the appropriate ParentTable values as custom filter dropdowns in each column of the Grid.
The issue:
When i select a new value in the dropdowns, i am getting value not found error on the filter event.
I have tried to overload the DynamicGridBoundColumn both the GetCurrentFilterValueFromControl and the SetCurrentFilterValueToControl.
protected override string GetCurrentFilterValueFromControl(TableCell cell) { if (cell.Controls[0] is RadComboBox) { string currentValue = ((RadComboBox)cell.Controls[0]).SelectedItem.Text; this.CurrentFilterFunction = (currentValue != "" && currentValue != "empty ") ? GridKnownFunction.EqualTo : GridKnownFunction.NoFilter; return currentValue; } else return base.GetCurrentFilterValueFromControl(cell); } protected override void SetCurrentFilterValueToControl(TableCell cell) { if (cell.Controls[0] is RadComboBox) { if (!(this.CurrentFilterValue == "")) { ((RadComboBox)cell.Controls[0]).Items.FindItemByText(this.CurrentFilterValue).Selected = true; } } else base.SetCurrentFilterValueToControl(cell); }I have even trapped the event in the Grid_ItemCommand Event setting the FilterExpression on the column and the MasterTableView.
#region Filter Itemsif (e.CommandName == RadGrid.FilterCommandName){ Pair filterPair = (Pair)e.CommandArgument; GridFilteringItem item = e.Item as GridFilteringItem; GridColumn filterColumn = item.OwnerTableView.GetColumn(filterPair.Second.ToString()); filterColumn.CurrentFilterFunction = GridKnownFunction.EqualTo; filterColumn.CurrentFilterValue = filterPair.First.ToString(); RadGrid1.MasterTableView.FilterExpression = filterColumn.EvaluateFilterExpression(item); }#endregionI'm not sure if there is something i am missing. The underlying column that i am trying to filter is a DynamicControl and is a ForeignKey so the values of the drid are actually the DisplayName of the parent table. At one point i was getting a datatype miss-match as the comparer was trying to filter the EntityName (SiteLocation) to a string, which was the value (key) selected in the dropdown from the parrent table.
Any Ideas or help would be appreciated.
Thanks
Paul
I've an editable RadGrid which on edit shows a custom user control as a pop-up. The grid was embedded in an update panel and the user control used jQuery Validation plugin for validating the inputs.
I was facing issues with displaying the wait panel during ajax calls. To resolve this I removed the update panel and implemented RadAjaxManager following which the wait panel is functioning perfectly. But that broke the jQuery Validation plugin functionality. What I understand is that RadAjaxManager handles the ajax requests and doesnt trigger the events that the validation plugin is hooked to.
Is there any way of getting RadGrid + RadAjaxManager + jQuery Validation Plugin working. I do not want to do old-school way of placing custom validation code as there is extensive validation implemented using the validation plugin. Any workaround to get this working would be greatly appreciated.
Thanks in advance.
Regards.
protected void RadCombo1_ItemDataBound(object sender, RadComboBoxItemEventArgs e) { dynamic data = e.Item.DataItem; e.Item.Text = data.MyText;}//e.Item.Value = data.MyCode;