如何为telerik radgrid中的不同列应用不同的过滤器选项?

时间:2017-01-06 11:45:18

标签: asp.net telerik telerik-grid radgrid radgridview

对于telerik Radgrid,我们获取过滤列的默认值。但我需要为不同的列提供不同的过滤选项。

我可以删除一些像这样的选项

loc-args

但是这里的问题是所有列都删除了过滤器选项。我需要针对不同列的不同过滤器选项。 服务器端选项是首选。 提前致谢

2 个答案:

答案 0 :(得分:0)

http://docs.telerik.com/devtools/aspnet-ajax/controls/grid/how-to/Filtering/reduce-the-filter-menu-options

直接来自Telerik:这不可能使用服务器端代码。您必须使用上面链接中的客户端示例(粘贴在下面):

<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">
    <script type="text/javascript">
        var column = null;
        function MenuShowing(sender, args) {
            if (column == null) return;
            var menu = sender; var items = menu.get_items();
            if (column.get_dataType() == "System.String") {
                var i = 0;
                while (i < items.get_count()) {
                    if (!(items.getItem(i).get_value() in { 'NoFilter': '', 'Contains': '', 'NotIsEmpty': '', 'IsEmpty': '', 'NotEqualTo': '', 'EqualTo': '' })) {
                        var item = items.getItem(i);
                        if (item != null)
                            item.set_visible(false);
                    }
                    else {
                        var item = items.getItem(i);
                        if (item != null)
                            item.set_visible(true);
                    } i++;
                }
            }
            if (column.get_dataType() == "System.Int64") {
                var j = 0; while (j < items.get_count()) {
                    if (!(items.getItem(j).get_value() in { 'NoFilter': '', 'GreaterThan': '', 'LessThan': '', 'NotEqualTo': '', 'EqualTo': '' })) {
                        var item = items.getItem(j); if (item != null)
                            item.set_visible(false);
                    }
                    else { var item = items.getItem(j); if (item != null) item.set_visible(true); } j++;
                }
            }
            column = null;
            menu.repaint();
        }
        function filterMenuShowing(sender, eventArgs) {
            column = eventArgs.get_column();
        }
    </script>
</telerik:RadCodeBlock>
<telerik:RadGrid...>
    //Additional markup removed
    <FilterMenu OnClientShowing="MenuShowing" />
</telerik:RadGrid>

Telerik的解释:

  

服务器端有一个过滤菜单对象。不是全部   项目出现在客户端的每个过滤器菜单中....过滤菜单对每个过滤菜单都是独立的   RadGrid中的列 - 这意味着过滤菜单选项会有所不同   相应列的DataType ....但是,如果删除了一些选项   从服务器上的菜单,这将影响所有网格列和   它们将从每个列过滤器菜单选项中删除(如果   对于该类型的列,默认情况下可用。)

答案 1 :(得分:0)

Chambo solution可以自定义以解决这个问题。

在Js:

首先,当您需要访问Column Name时,可以将其添加到filterMenuShowing函数中。或者通过get_uniqueName()上的column访问它。

var column = null;
var columnName = null;

function MenuShowing(sender, args) {
    if (column == null) return;
    if (columnName == null) return;
    var menu = sender; var items = menu.get_items();
    if (columnName == "Date") { // If the column name is Date
        var i = 0;
        while (i < items.get_count()) {
            if (!(items.getItem(i).get_value() in { 'NoFilter': '', 'Contains': '', 'GreaterThan': '', 'LessThan': '' })) {
                var item = items.getItem(i);
                if (item != null){
                    item.set_visible(false);
                }
            }
            else { // Not mandatory.
                var item = items.getItem(i);
                if (item != null){
                    item.set_visible(true);
                }
            } i++;
        }
    }
    else {
        if (columnName == "Name") {
            var j = 0;
            while (j < items.get_count()) {
                if (!(items.getItem(j).get_value() in { 'NoFilter': '', 'Contains': '', 'StartsWith': '', 'EndsWith': '' })) {
                    var item = items.getItem(j);
                    if (item != null){
                        item.set_visible(false);
                    }
                }
                else { // Not mandatory.
                    var item = items.getItem(j);
                    if (item != null){
                        item.set_visible(true);
                    }
                } j++;
            }
        }
    }
    column = null;
    columnName = null;
}
function filterMenuShowing(sender, eventArgs) {
    column = eventArgs.get_column();
    columnName = eventArgs.get_column().get_uniqueName();
}

在Aspx中:

您需要将您的功能链接到正确的客户端事件,如文档中所示。

<ClientSettings>
    <Scrolling AllowScroll="false" />
    <ClientEvents OnFilterMenuShowing="filterMenuShowing" />
</ClientSettings>

<FilterMenu OnClientShowing="MenuShowing" />