如何在应用更多过滤器时减少 radgrid 中的过滤器选项

How to reduce the filter options in radgrid as more filters are applied

在我的 RadGrid 中,我使用 FilterType="Combined" 并且我使用 FilterCheckListItemsRequested 方法绑定过滤器下拉列表。我的代码如下所示:

protected void rgCallRecordings_FilterCheckListItemsRequested(object sender, GridFilterCheckListItemsRequestedEventArgs e)
    {
        // Get the list of calls stored in session
        var results = (IQueryable<DC_CR_RECORDING>)Session["CallRecordings"];

        // Get the column name
        string dataField = (e.Column as IGridDataColumn).GetActiveDataField();

        // Get the filter expression of the grid
        string filterExpression = rgCallRecordings.MasterTableView.FilterExpression;

        // Initialise new list
        IEnumerable<DC_CR_RECORDING> DistinctList = new List<DC_CR_RECORDING>();            

        // Depending on which column it is change the data output.
        switch (dataField)
        {
            case "SCRIPT_AGENT":
                // Seperate the script agents from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_AGENT).Select(group => group.First());                    
                break;
            case "CLIENT_NAME":
                // Seperate the Client name from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_NAME).Select(group => group.First());
                break;
            case "CLIENT_REF_NUMBER":
                // Seperate the Client name from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_REF_NUMBER).Select(group => group.First());
                break;
            case "CLIENT_LINK_REF":
                // Seperate the Client link reference from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_LINK_REF).Select(group => group.First());
                break;
            case "SCRIPT_TYPE":
                // Seperate the call direction from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_TYPE).Select(group => group.First());
                break;
            case "SCRIPT_RESULT":
                // Seperate the call direction from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_AGENT).Select(group => group.First());
                break;
        }

我试图在每次应用新过滤器时更新过滤器选项,因此选项列表仅显示过滤网格中存在的项目。我尝试在应用过滤器时获取过滤器表达式,但我不确定如何将其应用于结果集。

我决定使用不同的方法,而不是使用 rad 网格的过滤器表达式,并在应用过滤器时使用 rad 网格本身中的当前数据:

        // If there is a filter applied then enter the loop if there isn't then the filter expression will be empty 
        if (!String.IsNullOrEmpty(filterExpression))
        {                
            // Create a new list of strings to hold the sequence ids
            List<string> sequenceIds = new List<string>();

            // For each row in the radgrid...
            foreach (GridDataItem row in rgCallRecordings.Items) // loops through each rows in RadGrid
            {
                // ...Add the sequence id to the list
                sequenceIds.Add(row.GetDataKeyValue("SEQUENCE_ID").ToString());                    
            }
            // Only return results whose sequence ids are in the list
            results = results.Where(a => sequenceIds.Contains(a.SEQUENCE_ID));                
        }    

整个方法现在看起来像这样:

protected void rgCallRecordings_FilterCheckListItemsRequested(object sender, GridFilterCheckListItemsRequestedEventArgs e)
    {
        // Get the list of calls stored in session
        var results = (IQueryable<DC_CR_RECORDING>)Session["CallRecordings"];

        var listResults = results.ToList();
        // Get the column name
        string dataField = (e.Column as IGridDataColumn).GetActiveDataField();

        // Get the filter expression of the grid to determine if there is
        string filterExpression = rgCallRecordings.MasterTableView.FilterExpression;

        // Initialise new list
        IEnumerable<DC_CR_RECORDING> DistinctList = new List<DC_CR_RECORDING>();

        // If there is a filter applied then enter the loop if there isn't then the filter expression will be empty 
        if (!String.IsNullOrEmpty(filterExpression))
        {                
            // Create a new list of strings to hold the sequence ids
            List<string> sequenceIds = new List<string>();

            // For each row in the radgrid...
            foreach (GridDataItem row in rgCallRecordings.Items) // loops through each rows in RadGrid
            {
                // ...Add the sequence id to the list
                sequenceIds.Add(row.GetDataKeyValue("SEQUENCE_ID").ToString());                    
            }
            // Only return results whose sequence ids are in the list
            results = results.Where(a => sequenceIds.Contains(a.SEQUENCE_ID));                
        }            

        // Depending on which column it is change the data output.
        switch (dataField)
        {
            case "SCRIPT_AGENT":
                // Seperate the script agents from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_AGENT).Select(group => group.First());                    
                break;
            case "CLIENT_NAME":
                // Seperate the Client name from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_NAME).Select(group => group.First());
                break;
            case "CLIENT_REF_NUMBER":
                // Seperate the Client name from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_REF_NUMBER).Select(group => group.First());
                break;
            case "CLIENT_LINK_REF":
                // Seperate the Client link reference from the call recordings
                DistinctList = results.GroupBy(s => s.CLIENT_LINK_REF).Select(group => group.First());
                break;
            case "SCRIPT_TYPE":
                // Seperate the call direction from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_TYPE).Select(group => group.First());
                break;
            case "SCRIPT_RESULT":
                // Seperate the call outcome from the call recordings
                DistinctList = results.GroupBy(s => s.SCRIPT_RESULT).Select(group => group.First());
                break;
        }

        RadListBoxItem rlbItem = new RadListBoxItem();

        // Bind the filter list box with the results corresponding to which column the user selected
        e.ListBox.DataSource = DistinctList;
        e.ListBox.DataKeyField = dataField;
        e.ListBox.DataTextField = dataField;
        e.ListBox.DataValueField = dataField;
        e.ListBox.DataBind();

    }

过滤器现在会在每次应用新过滤器时更新。