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

Combining Multiple radcombobox filters on grid

2 Answers 108 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Marc
Top achievements
Rank 1
Marc asked on 22 Apr 2014, 03:55 PM
I have a grid with a number of columns with radcombobox filter templates. I want to be able to select a filter on a column (eg Company) and then select a filter on another column (eg Part Type) and have the filter expression combine so I could see part types for a particular company only or if further filters are selected then have them added to the filter clause.

I am able to do this with one combo, but not combine the expressions.

protected void cboFilterCompany_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e)
{
    RadComboBox combo = sender as RadComboBox;
    ViewState["CompanyFilterVal"] = e.Value; //to persist value
 
    GridColumn column = grdParts.MasterTableView.GetColumnSafe("Company");
 
    //if (grdParts.MasterTableView.FilterExpression != "")
    //{
    //    //append?
    //}
 
    grdParts.MasterTableView.FilterExpression = "([Company] = '" + e.Text + "')";
    column.CurrentFilterFunction = GridKnownFunction.EqualTo;
    column.CurrentFilterValue = e.Text;
 
    grdParts.MasterTableView.Rebind();
}


2 Answers, 1 is accepted

Sort by
0
Accepted
Princy
Top achievements
Rank 2
answered on 24 Apr 2014, 05:49 AM
Hi Marc,

If you want to combine filter expression, you have to handle it manually. Please take a look at the sample code snippet that I tried.

ASPX:
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" DataSourceID="SqlDataSource1"    AllowPaging="true" AllowFilteringByColumn="true" EnableLinqExpressions="false" OnItemCommand="RadGrid1_ItemCommand">
    <MasterTableView DataKeyNames="OrderID" CommandItemDisplay="Top">
        <CommandItemTemplate>
            <br />
            <asp:Button ID="btnFilter" runat="server" Text="Filter" CommandName="CombineFilter" />
            <br />
        </CommandItemTemplate>
        <Columns>
            <telerik:GridBoundColumn UniqueName="OrderID" DataField="OrderID" HeaderText="OrderID">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn DataField="ShipCity" HeaderText="ShipCity" UniqueName="ShipCity">
                <FilterTemplate>
                    <telerik:RadComboBox ID="RadComboBoxCity" runat="server" DataSourceID="SqlDataSource1" DataTextField="ShipCity" DataValueField="ShipCity">
                    </telerik:RadComboBox>
                </FilterTemplate>
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn UniqueName="EmployeeID" DataField="EmployeeID" HeaderText="EmployeeID">
                <FilterTemplate>
                    <telerik:RadComboBox ID="RadComboBoxEID" runat="server" DataSourceID="SqlDataSource1" DataTextField="EmployeeID" DataValueField="EmployeeID">
                    </telerik:RadComboBox>
                </FilterTemplate>
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn DataField="OrderDate" HeaderText="OrderDate" UniqueName="OrderDate">
            </telerik:GridBoundColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
    SelectCommand="SELECT  * FROM [Orders]"></asp:SqlDataSource>

C#:
protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
    string filterExpression, city, EId  ;
    if (e.CommandName == "CombineFilter")
    {
        GridFilteringItem filterItem = RadGrid1.MasterTableView.GetItems(GridItemType.FilteringItem)[0] as GridFilteringItem;     
        RadComboBox comboCity = (RadComboBox)filterItem.FindControl("RadComboBoxCity");
        city = comboCity.SelectedItem.Text;
        RadComboBox comboName = (RadComboBox)filterItem.FindControl("RadComboBoxEID");
        EId = comboName.SelectedItem.Text;
        filterExpression = "([ShipCity] ='" + city + "')";
        filterExpression += " AND ([EmployeeID] =' " + EId + "')";
        RadGrid1.MasterTableView.FilterExpression = filterExpression;
        RadGrid1.MasterTableView.Rebind();
    }
}

Thanks,
Princy
0
Marc
Top achievements
Rank 1
answered on 25 Apr 2014, 10:45 AM
Hi Princy,

Thank you for your reply, I used what you suggested and modified it to my needs. attached the code below if it is any help to others...

This method runs on a button click to apply the filters

protected void CombineFilters()
{
    string filterToApply = "";
    List<string> filtexprn = new List<string>();
 
    GridFilteringItem filterItem = grdParts.MasterTableView.GetItems(GridItemType.FilteringItem)[0] as GridFilteringItem;
     
    //COMPANY
    RadComboBox cboCompany = (RadComboBox)filterItem.FindControl("cboFilterCompany");           
    if(cboCompany.SelectedIndex != -1)
    {
        filtexprn.Add("([Company] ='" + cboCompany.SelectedValue + "')");
        ViewState["CompanyFilterVal"] = cboCompany.SelectedValue; //to persist value on postback
    }
 
    //NEW PART #
    RadTextBox txtPartNo = (RadTextBox)filterItem.FindControl("txtFilterPartNo");
    if (txtPartNo.Text != "")
    {
        filtexprn.Add("([NewPartNo] LIKE '%" + txtPartNo.Text + "%')");
        ViewState["PartNoFilterVal"] = txtPartNo.Text; //to persist value on postback
    }
     
    //ETC
    //...
    //...
 
    int count = filtexprn.Count - 1;
    foreach (string s in filtexprn)
    {
        filterToApply += s;
        if(count-- != 0)
            filterToApply += " AND ";               
    }
     
    grdParts.MasterTableView.FilterExpression = filterToApply;
    grdParts.MasterTableView.Rebind();           
}

the code for the grid

<telerik:RadGrid ID="grdParts" runat="server"
    OnItemCreated="grdParts_ItemCreated"
    OnNeedDataSource="grdParts_NeedDataSource"
    AllowFilteringByColumn="true"
    AllowSorting="true"
    AllowPaging="True"
    PageSize="15"
    EnableLinqExpressions="false"
    AllowMultiRowSelection="true">
    <PagerStyle AlwaysVisible="true"></PagerStyle>
    <MasterTableView AutoGenerateColumns="False" DataKeyNames="UniquePartID" ClientDataKeyNames="UniquePartID"
        Width="100%" CommandItemDisplay="None" PageSize="20">
        <Columns>
            ...
            <telerik:GridBoundColumn DataField="Company" HeaderText="Company" SortExpression="Company" UniqueName="Company" FilterControlAltText="Filter Company column"
                ItemStyle-Width="5%" HeaderStyle-Width="5%" AllowFiltering="true" AllowSorting="true" FilterControlWidth="60%">
                <FilterTemplate>
                    <telerik:RadComboBox runat="server" ID="cboFilterCompany" AutoPostBack="false"
                        OnPreRender="cboFilterCompany_PreRender"
                        DataValueField="CompanyID" DataTextField="CompanyDescription"
                        EmptyMessage="Filter..."
                        Width="100%">
                    </telerik:RadComboBox>
                </FilterTemplate>
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn DataField="NewPartNo" ReadOnly="True" HeaderText="New Part #" SortExpression="NewPartNo" UniqueName="NewPartNo" FilterControlAltText="Filter NewPartNo column"
                ItemStyle-Width="5%" HeaderStyle-Width="5%" AllowFiltering="true" AllowSorting="true" FilterControlWidth="60%">
                <FilterTemplate>
                    <telerik:RadTextBox runat="server" ID="txtFilterPartNo" AutoPostBack="false" Width="100%" OnPreRender="txtFilterPartNo_PreRender"></telerik:RadTextBox>
                </FilterTemplate>
            </telerik:GridBoundColumn>
            ...
        </Columns>
    </MasterTableView>
    <ClientSettings>
        <Selecting AllowRowSelect="true">
        </Selecting>
        <ClientEvents OnRowDblClick="RowDblClick"></ClientEvents>
    </ClientSettings>
    <GroupingSettings CaseSensitive="false" />
</telerik:RadGrid>

And finally the datasource for the combobox filter is set in the itemcreated event of the grid

protected void grdParts_ItemCreated(object sender, Telerik.Web.UI.GridItemEventArgs e)
{
    if (e.Item is GridFilteringItem)
    {
        GridFilteringItem filterItem = (GridFilteringItem)e.Item;
 
        //COMPANY                       
        RadComboBox CompanyCbo = (RadComboBox)filterItem["Company"].FindControl("cboFilterCompany");
        CompanyCbo.DataSource = GetCompanyFilterData();
        CompanyCbo.DataBind();
    }
}
Tags
Grid
Asked by
Marc
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 2
Marc
Top achievements
Rank 1
Share this question
or