【问题标题】:How to reduce the filter options in radgrid as more filters are applied当应用更多过滤器时如何减少 radgrid 中的过滤器选项
【发布时间】:2016-02-17 11:14:51
【问题描述】:

在我的 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;
        }

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

【问题讨论】:

    标签: c# asp.net telerik telerik-grid radgrid


    【解决方案1】:

    我决定使用不同的方法,而不是使用 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();
    
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2021-07-05
      • 2016-11-19
      相关资源
      最近更新 更多