Iam trying to create a Google like filtering in RadGrid.I used the sample specified by telerik in the following link
http://www.telerik.com/help/aspnet/grid/grdgooglelikefiltering.html
I used the the same class provided in the sample MyCustomFilteringColumn
I just tried by setting the Google filtering only for one column
When i execute the code the combo box is displaying but when i choose a value then on page reload it throws the following error
Sys.WebForms.PageRequestManagerServerErrorException: Failed to load viewstate. The control tree into whcih viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding cintrols dynamically, the comtrols added during a post-back must match the type and position of the controls added during the initial request.
Please see sample code
ASPX
------
<
telerik:RadGrid ID="radGridMarkets" runat="server" AllowPaging="True" AutoGenerateColumns="False"
GridLines="None" OnNeedDataSource="radGridMarkets_NeedDataSource" PageSize="100"
Skin="Office2007">
<AlternatingItemStyle BackColor="#EDEFF1" BorderColor="Blue" />
<ItemStyle BorderStyle="Solid" />
<PagerStyle AlwaysVisible="True" Mode="Advanced" Position="TopAndBottom" />
<ClientSettings>
<Selecting AllowRowSelect="true" />
</ClientSettings>
<MasterTableView AllowFilteringByColumn="true">
<RowIndicatorColumn>
<HeaderStyle Width="20px" />
</RowIndicatorColumn>
<ExpandCollapseColumn>
<HeaderStyle Width="20px" />
</ExpandCollapseColumn>
<Columns>
<telerik:GridBoundColumn DataField="Tag" HeaderText="Tag" UniqueName="_colTag">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn
DataField="ShortDescription" HeaderText="Short Description"
UniqueName="_colMktShortDesc">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn
DataField="LongDescription" HeaderText="Long Description"
UniqueName="_colMktLongDesc">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="ExchngRateMarketTag" HeaderText="Exchange Rate Tag "
UniqueName="_colExchngRateMarketTag ">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="ConvertLocalCurrency"
HeaderText="Convert Local Currency " UniqueName="_colMktConvertLocalCurrency ">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="IndexConsolidation" HeaderText="Index Consolidation"
UniqueName="_colIndexConsolidation ">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="MarketConsolidation" HeaderText="Market Consolidation"
UniqueName="_colMarketConsolidation">
</telerik:GridBoundColumn>
</Columns>
</MasterTableView>
<FilterMenu EnableTheming="True">
<CollapseAnimation Duration="200" Type="OutQuint" />
</FilterMenu>
<EditItemStyle BorderStyle="Solid" />
</telerik:RadGrid></telerik:RadPageView
MyCustomFilteringColumn Class File
----------------------------------------
#region
Google Filter template Column
public class MyCustomFilteringColumn : GridBoundColumn
{
private object listDataSource = null;
//RadGrid calls this method when it initializes the controls inside the filtering item cells
protected override void SetupFilterControls(TableCell cell)
{
base.SetupFilterControls(cell);
cell.Controls.RemoveAt(0);
RadComboBox list = new RadComboBox();
list.ID =
"list" + this.DataField;
list.AutoPostBack =
true;
list.EnableLoadOnDemand =
true;
list.MarkFirstMatch =
true;
list.ShowToggleImage =
false;
list.SelectedIndexChanged +=
new RadComboBoxSelectedIndexChangedEventHandler(list_SelectedIndexChanged);
cell.Controls.AddAt(0, list);
cell.Controls.RemoveAt(1);
list.Width = 100;
list.DataTextField =
this.DataField;
list.DataValueField =
this.DataField;
list.DataSource =
this.ListDataSource;
list.DataBind();
}
protected void list_SelectedIndexChanged(object sender, EventArgs e)
{
GridFilteringItem filterItem = (sender as DropDownList).NamingContainer as GridFilteringItem;
if (this.DataType == System.Type.GetType("System.Int32") ||
this.DataType == System.Type.GetType("System.Int16") ||
this.DataType == System.Type.GetType("System.Int64"))
{
filterItem.FireCommandEvent(
"Filter", new Pair("EqualTo", this.UniqueName));
}
else // treat everything else like a string
filterItem.FireCommandEvent(
"Filter", new Pair("Contains", this.UniqueName));
}
public object ListDataSource
{
get { return this.listDataSource; }
set { listDataSource = value; }
}
//RadGrid calls this method when the value should be set to the filtering input control(s)
protected override void SetCurrentFilterValueToControl(TableCell cell)
{
base.SetCurrentFilterValueToControl(cell);
RadComboBox list = (RadComboBox)cell.Controls[0];
if (this.CurrentFilterValue != string.Empty)
{
list.SelectedValue =
this.CurrentFilterValue;
}
}
//RadGrid calls this method to extract the filtering value from the filtering input control(s)
protected override string GetCurrentFilterValueFromControl(TableCell cell)
{
RadComboBox list = (RadComboBox)cell.Controls[0];
return list.SelectedValue;
}
protected override string GetFilterDataField()
{
return this.DataField;
}
}
#endregion
Code Behind:----------------
//Add Google Filtering for Market Columns
radGridMarkets.MasterTableView.Columns.Clear();
GridBoundColumn col2 = new MyCustomFilteringColumn();
radGridMarkets.Columns.Add(col2);
col2.DataField =
"Tag";
col2.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktTag";
col2.HeaderText =
"Tag";
GridBoundColumn col3 = new GridBoundColumn();
radGridMarkets.Columns.Add(col3);
col3.DataField =
"ShortDescription";
col3.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktShortDescription";
col3.HeaderText =
"Short Description";
GridBoundColumn col4 = new GridBoundColumn();
radGridMarkets.Columns.Add(col4);
col4.DataField =
"LongDescription";
col4.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktLongDescription";
col4.HeaderText =
"Long Description";
GridBoundColumn col5 = new GridBoundColumn();
radGridMarkets.Columns.Add(col5);
col5.DataField =
"ExchngRateMarketTag";
col5.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktExchngRateMarketTag";
col5.HeaderText =
"Exchange Rate Tag";
GridBoundColumn col6 = new GridBoundColumn();
radGridMarkets.Columns.Add(col6);
col6.DataField =
"ConvertLocalCurrency";
col6.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktConvertLocalCurrency";
col6.HeaderText =
"Convert Local Currency";
GridBoundColumn col7 = new GridBoundColumn();
radGridMarkets.Columns.Add(col7);
col7.DataField =
"IndexConsolidation";
col7.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktIndexConsildation";
col7.HeaderText =
"Index Consolidation";
GridBoundColumn col8 = new GridBoundColumn();
radGridMarkets.Columns.Add(col8);
col8.DataField =
"MarketConsolidation";
col8.UniqueName = radGridMarkets.MasterTableView.Name +
"_colMktMarketConsolidation";
col8.HeaderText =
"Market Consolidation";
#region
RadMarkets Data Binding
protected void radGridMarkets_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
if (!e.IsFromDetailTable)
{
int dbId = (int)HttpContext.Current.Session["INSTR_ID"];
List<InstrMarket> _lstmarket = _presenter.PopulateMarketsData(dbId);
foreach (GridBoundColumn column in radGridMarkets.MasterTableView.Columns)
{
if (column is MyCustomFilteringColumn)
{
List<String> itemsList = new List<String>();
foreach (InstrMarket item in _lstmarket)
{
itemsList.Add(item.Tag);
}
(column
as MyCustomFilteringColumn).ListDataSource = _lstmarket;
}
}
radGridMarkets.DataSource = _lstmarket;
}
}
private void radGridMarkets_ColumnCreating(object sender, GridColumnCreatingEventArgs e)
{
if ((e.ColumnType == typeof(MyCustomFilteringColumn).Name))
{
e.Column =
new MyCustomFilteringColumn();
}
}
protected void radGridMarkets_ItemCommand(object source, GridCommandEventArgs e)
{
if ((e.CommandName == "Filter"))
{
foreach (GridColumn column in e.Item.OwnerTableView.Columns)
{
column.CurrentFilterValue =
string.Empty;
column.CurrentFilterFunction =
GridKnownFunction.NoFilter;
}
}
}
#endregion