过滤未与DataField绑定的GridBoundColumn

时间:2015-06-01 13:08:22

标签: telerik-grid radgrid

我正在尝试为GridBoundColumn实现过滤功能。这是我的Grid的样子

<telerik:RadGrid ID="radSelect" runat="server" AllowFilteringByColumn="True" AllowPaging="True"
        AutoGenerateColumns="False" ResolvedRenderMode="Classic">
        <MasterTableView AllowNaturalSort="False" DataKeyNames="EmployeeInfoID,DateOfBirth" ClientDataKeyNames="EmployeeInfoID,DateOfBirth" >
            <Columns>
                <telerik:GridBoundColumn DataType="System.Int16" FilterControlAltText="Filter Age column"
                    HeaderText="Age" UniqueName="Age" CurrentFilterFunction="LessThan">
                </telerik:GridBoundColumn>                    
            </Columns>
        </MasterTableView>
    </telerik:RadGrid>

我正在根据从数据库以编程方式接收的DateOfBirth值设置Age Column中的值。我想在Age Column上实现各种过滤选项,例如GreaterThan,LessThan,Between等。有人可以指导我们如何阻止这样的选择吗?

1 个答案:

答案 0 :(得分:0)

您可以通过一些简单的Javascript代码并向RadGrid添加一些组件来实现此目的。

的Javascript

<telerik:RadCodeBlock ID="RadCodeBlock" 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>

ASP.NET

<telerik:RadGrid ID="rgTest" runat="server" AllowFilteringByColumn="true" AllowSorting="true">
  <ClientSettings>
    <ClientEvents OnFilterMenuShowing="filterMenuShowing()" />
  </ClientSettings>
  <MasterTableView>
    <Columns>
      <telerik:GridBoundColumn DataField="due_date" DataType="System.DateTime"
        FilterControlAltText="Filter Due Date Column" HeaderText="Due Date"
        AutoPostBackOnFilter="false" DataFormatString="{0:MM/dd/yyyy}" />
    </Columns>
    <FilterMenu OnClientShowing="MenuShowing()" />
  </MasterTableView>
</telerik:RadGrid>

我到目前为止还不是专家,但这个解决方案适合我。您必须调整它以匹配您要查找的内容。我希望这有帮助!

修改

看来您不必使用JavaScript来实现这一目标。 RadGrid将处理菜单。以下是该列的更新示例,其他所有内容保持不变:

<telerik:GridBoundColumn FilterControlWidth="95px" DataField="ShippedDate" HeaderText="Shipped Date" PickerType="DatePicker" EnableRangeFiltering="true" />