简体   繁体   中英

Default Filter on Radgrid Telerik error with column number

I have a page with Radgrid. Everything is ok until i implement a custom filter and set default filter depend on session. i make a tooltip on column header that allow user can choose a item for filter radgrid.

在此处输入图片说明

All of columns run nice except "TotalAmount" column. Nothing happens when i click item on tooltip.

在此处输入图片说明

Code set default filter when user click item on tooltip (Radgrid_PreRender):

 if (!IsPostBack)
        {
            if (Session["FilterParams"] != null)
            {
                ParamsForGrid prForGrid = new ParamsForGrid();
                Filters filter = new Filters();
                filter = prForGrid.GetFilter();
                rgOrders.MasterTableView.FilterExpression = "([" + filter.columnName + "] LIKE \'%" + filter.searchStrings + "%\') ";
                GridColumn column = rgOrders.MasterTableView.GetColumnSafe(filter.columnName);
                column.CurrentFilterFunction = GridKnownFunction.Contains;
                column.CurrentFilterValue = filter.searchStrings;
                rgOrders.MasterTableView.Rebind();
            }

        }

How to fix it. I use telerik control version 2012.3.1016.35

Update: Picture below show screen after i clicked on tooltip, param had sent to filter of radgrid, when i debug, FilterExpression get a value exactly, radgrid also rebind, but it not filter.

在此处输入图片说明

Update 2 "Code Tooltip":

In this page i used 2 RadtooltipManager, one for rows of grid and one for columns header.

Design view:

        <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
    </telerik:RadScriptManager>
    <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server">
    </telerik:RadAjaxLoadingPanel>
    <telerik:RadWindowManager ID="RadWindowManager1" runat="server">
    </telerik:RadWindowManager>

    <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server">
        <div>
            Keyword:<telerik:RadTextBox ID="rtbSearch" runat="server" Skin="Web20" Width="150px" EmptyMessage="Enter customer name..." ViewStateMode="Enabled"></telerik:RadTextBox>
            <telerik:RadComboBox ID="rcbProvince" Skin="Web20" runat="server" OnDataBound="rcbProvince_DataBound">
            </telerik:RadComboBox>
            Start
        <telerik:RadDatePicker ID="rdpStartDay" runat="server" ShowPopupOnFocus="True"></telerik:RadDatePicker>
            End
        <telerik:RadDatePicker ID="rdpEndDay" runat="server" ShowPopupOnFocus="True"></telerik:RadDatePicker>
            <telerik:RadButton ID="rbSearch" Text="Search" OnClientClicked="checkDate" runat="server" Skin="Web20" OnClick="rbSearch_Click"></telerik:RadButton>
            <div class="blank"></div>
            <div>
                <telerik:RadGrid ID="rgOrders" EnableLinqExpressions="false" AllowPaging="True" runat="server" AllowSorting="True" AllowMultiRowSelection="True" AutoGenerateColumns="False" GridLines="None" OnItemCreated="rgOrders_ItemCreated" OnPreRender="rgOrders_PreRender" OnItemDataBound="rgOrders_ItemDataBound" OnItemCommand="rgOrders_ItemCommand" PageSize="5" Skin="Web20" OnPageIndexChanged="rgOrders_PageIndexChanged" OnSortCommand="rgOrders_SortCommand" OnNeedDataSource="rgOrders_NeedDataSource">
                    <GroupingSettings CaseSensitive="false" />
                    <MasterTableView DataKeyNames="CustomerId" AllowMultiColumnSorting="true" AllowFilteringByColumn="true">
                        <SortExpressions>
                            <telerik:GridSortExpression FieldName="OrderDate" SortOrder="Descending" />
                        </SortExpressions>
                        <CommandItemSettings ExportToPdfText="Export to Pdf" />
                        <Columns>
                            <telerik:GridClientSelectColumn UniqueName="ClientSelectColumn">
                            </telerik:GridClientSelectColumn>
                            <telerik:GridTemplateColumn AllowFiltering="false" HeaderText="No.">
                                <ItemTemplate>
                                    <%# (Container.DataSetIndex+1).ToString() %>
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Font-Bold="True" HorizontalAlign="Center" />
                            </telerik:GridTemplateColumn>
                            <telerik:GridTemplateColumn AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" DataField="Name" HeaderText="Customer Name" SortExpression="Name" UniqueName="Name">
                                <ItemTemplate>
                                    <asp:HyperLink ID="targetControl" runat="server" NavigateUrl='<%# Eval("OrderId","UpdateOrders.aspx?OrderId={0}") %>' Text='<%# Eval("Name") %>'></asp:HyperLink>
                                </ItemTemplate>
                            </telerik:GridTemplateColumn>
                            <telerik:GridBoundColumn DataField="OrderId" HeaderText="Order No" CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" UniqueName="OrderID">
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Font-Bold="True" HorizontalAlign="Center" />
                            </telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="OrderDate" HeaderText="Order Date" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" ShowFilterIcon="false" UniqueName="OrderDate">
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle HorizontalAlign="Center" />
                            </telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="PaymentTypeName" CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" ShowFilterIcon="false" HeaderText="Payment Type" UniqueName="PaymentTypeName">
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle HorizontalAlign="Center" />
                            </telerik:GridBoundColumn>   
                            <telerik:GridBoundColumn DataField="TotalAmount" DataType="System.String" HeaderText="TotalAmount" CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" ShowFilterIcon="false" UniqueName="TotalAmount">
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Font-Bold="True" HorizontalAlign="Center" />
                            </telerik:GridBoundColumn>
                            <telerik:GridTemplateColumn DataField="IsClosed" ShowFilterIcon="false" CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" HeaderText="IsClosed" SortExpression="IsClosed" UniqueName="IsClosed">
                                <ItemTemplate>
                                    <asp:Label ID="Label11" runat="server" Text='<%# Eval("IsClosed") %>'></asp:Label>
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Font-Bold="True" HorizontalAlign="Center" />
                            </telerik:GridTemplateColumn>
                            <telerik:GridTemplateColumn HeaderText="#" AllowFiltering="false">
                                <ItemTemplate>
                                    <asp:Button ID="btnXoa" runat="server" CommandArgument='<%# Eval("OrderId") %>' CommandName="DeleteOrder" OnClientClick="if(!confirm('Are you sure to delete?')) return false;" Text="X" />
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle HorizontalAlign="Center" />
                            </telerik:GridTemplateColumn>
                        </Columns>
                    </MasterTableView>
                    <FilterItemStyle HorizontalAlign="Center" />
                    <PagerStyle HorizontalAlign="Right" PageButtonCount="5" FirstPageText="First" FirstPageToolTip="" LastPageText="Last" LastPageToolTip="" NextPagesToolTip="" NextPageText="Next" NextPageToolTip="" PageSizeLabelText="" PrevPagesToolTip="" PrevPageText=" Previous" PrevPageToolTip="" EnableSEOPaging="True" />
                    <ClientSettings EnableRowHoverStyle="true">
                        <Selecting AllowRowSelect="True"></Selecting>
                    </ClientSettings>
                    <HeaderContextMenu CssClass="GridContextMenu GridContextMenu_Web20" EnableImageSprites="True">
                    </HeaderContextMenu>
                </telerik:RadGrid>
            </div>
            <div class="blank"></div>
            <div class="left">
                <asp:Button ID="btnDelete" runat="server" OnClientClick="if(!confirm('Are you sure to delete?')) return false;" Text="Delete" OnClick="btnDelete_Click" />
                <telerik:RadButton ID="rbtnCLose" runat="server" Text="Close" Skin="Web20" OnClick="rbtnCLose_Click"></telerik:RadButton>
            </div>
        </div>
    </telerik:RadAjaxPanel>
    <telerik:RadToolTipManager ID="RadToolTipManager1" OffsetY="-1" HideEvent="LeaveTargetAndToolTip"
        Width="250" Height="100" runat="server" OnAjaxUpdate="OnAjaxUpdate" RelativeTo="Element"
        Position="MiddleRight">
    </telerik:RadToolTipManager>
    <telerik:RadToolTipManager ID="RadToolTipManager2" ShowDelay="1000" HideDelay="500" OffsetY="-1" HideEvent="ManualClose"
        Width="180" Height="150" runat="server" OnAjaxUpdate="OnAjaxUpdateHeader" RelativeTo="Element"
        Position="TopCenter">
    </telerik:RadToolTipManager>

Code behind:

protected void OnAjaxUpdate(object sender, ToolTipUpdateEventArgs e)
    {
        this.UpdateToolTip(e.Value, e.UpdatePanel);
    }
    protected void OnAjaxUpdateHeader(object sender, ToolTipUpdateEventArgs e)
    {
        this.UpdateToolTipHeader(e.Value, e.UpdatePanel);
    }
    private void UpdateToolTip(string elementID, UpdatePanel panel)
    {
        Control ctrl = Page.LoadControl("controls/CustomerDetails.ascx");
        ctrl.ID = "UcCustomerDetails";
        panel.ContentTemplateContainer.Controls.Add(ctrl);
        controls.CustomerDetails details = (controls.CustomerDetails)ctrl;
        details.CustomerId = elementID;
    }
    private void UpdateToolTipHeader(string elementID, UpdatePanel panel)
    {
        Control ctrl = Page.LoadControl("controls/TooltipCategory.ascx");
        ctrl.ID = "UcTooltipCategory";
        panel.ContentTemplateContainer.Controls.Add(ctrl);
        controls.TooltipCategory details = (controls.TooltipCategory)ctrl;
        details.HeaderText = elementID;
    }

On ItemDatabound of Radgrid:

protected void rgOrders_ItemDataBound(object sender, GridItemEventArgs e)
    {
        if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
        {
            Control target = e.Item.FindControl("targetControl");
            if (!Object.Equals(target, null))
            {
                if (!Object.Equals(this.RadToolTipManager1, null))
                {
                    this.RadToolTipManager1.TargetControls.Add(target.ClientID, (e.Item as GridDataItem).GetDataKeyValue("CustomerId").ToString(), true);
                }
            }
        }
        else if (e.Item.ItemType == GridItemType.Header)
        {
            GridHeaderItem item = (GridHeaderItem)e.Item;
            if (!Object.Equals(this.RadToolTipManager2, null))
            {
               this.RadToolTipManager2.TargetControls.Add(item.Cells[4].ClientID, "Name", true);
               this.RadToolTipManager2.TargetControls.Add(item.Cells[6].ClientID, "OrderDate", true);
               this.RadToolTipManager2.TargetControls.Add(item.Cells[7].ClientID, "PaymentTypeName", true);
               this.RadToolTipManager2.TargetControls.Add(item.Cells[8].ClientID, "TotalAmount", true);
               this.RadToolTipManager2.TargetControls.Add(item.Cells[9].ClientID, "IsClosed", true);
            }         
        }
    }

My way for this issue is: when user hover on header, i will send text of column header to WebUserControl, it will return a list items with distinct value. After that i set initial Filter and refresh this page to get result. Important : everything is OK , only TotalAmount column not working.

Problems solved. i waste a lot of time with it :(.

Problem is 'Like' condition in FilterExpression, it make number column not filter.

rgOrders.MasterTableView.FilterExpression = "([" + filter.columnName + "] LIKE \'%" + filter.searchStrings + "%\') ";

i change code above to:

rgOrders.MasterTableView.FilterExpression = "([" + filter.columnName + "] = \'" + filter.searchStrings + "\') ";

It working nice for both string column and number column.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM