首页 文章

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

提问于
浏览
-1

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

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

protected void RadGrid1_Init(object sender, System.EventArgs e)
{
    GridFilterMenu menu = RadGrid1.FilterMenu;
    int i = 0;
    while (i < menu.Items.Count)
    {
        if (menu.Items[i].Text == "NoFilter" || menu.Items[i].Text == "Contains" || menu.Items[i].Text == "EqualTo" || menu.Items[i].Text == "GreaterThan" || menu.Items[i].Text == "LessThan")
        {
            i++;
        }
        else
        {
            menu.Items.RemoveAt(i);
        }
    }
}

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

2 回答

  • 0

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

    直接来自Telerik: This is not possible using server-side code. 您必须使用上面链接中的客户端示例(粘贴在下面):

    <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而异....但是,如果从服务器上的菜单中删除一些选项,这将影响所有网格列,并将从每个列筛选器菜单选项中删除它们(如果默认情况下可用于该类型的列) .

  • 0

    Chambo解决方案可以自定义以解决这个确切的问题 .

    在Js:

    首先,当您需要访问Column Name时,可以将其添加到 filterMenuShowing 函数中 . 或者通过 column 访问 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" />
    

相关问题