2014-07-25 58 views
1

我在运行时根据传入的配置构建了一个ASP.Net Telerik Radgrid,因此我的ASPX页面上没有radgrid标记。我试图实现功能,我可以将一个按钮添加到将显示或隐藏列过滤器的网格标题。Telerik ASP.Net Radgrid显示/隐藏筛选器

我使用的是Command Item Template是提供一种出现在显示/隐藏按钮,但是当我点击该按钮来显示或隐藏与使用grid.get_masterTableView()功能ShowHideFilters Javascript方法过滤器无法找到对电网的get_masterTableView()方法目的。

任何想法为什么这种方法丢失或更好的选择来实现我所需要的行为?

Telerik Radgrid Client API

从Telerik的API JavaScript示例

function getMasterTableView() { 
    var grid = $find("<%=RadGrid1.ClientID %>"); 
    var masterTableView = grid.get_masterTableView();    
} 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ShowGrid.aspx.vb" Inherits="ShowGrid" %> 

<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 

    <form id="ShowGrid" runat="server"> 

     <telerik:RadScriptManager ID="ScriptManager" runat="server"> 
     </telerik:RadScriptManager> 

     <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> 
      <AjaxSettings> 
       <telerik:AjaxSetting AjaxControlID="ConfigureGrid"> 
        <UpdatedControls> 
         <telerik:AjaxUpdatedControl ControlID="ConfigureGrid" LoadingPanelID="AjaxLoadingPanel" /> 
        </UpdatedControls> 
       </telerik:AjaxSetting> 
      </AjaxSettings> 
     </telerik:RadAjaxManager> 

     <telerik:RadAjaxLoadingPanel ID="AjaxLoadingPanel" runat="server"/> 

     <asp:SqlDataSource ID="PrimaryDataSource" runat="server"/> 
    </form> 

    <script type="text/javascript"> 

     function ShowHideFilters() 
     { 
      var grid = document.getElementById("ConfigureGrid") 
      if (grid) 
      { 
       var masterTableView = grid.get_masterTableView(); 
       window.alert(masterTableView.id) 
      } 

      window.alert(grid.id) 
     } 

    </script> 

</body> 
</html> 

后面

012典

建立从地上爬起来电网在Page_Init

Protected Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init 

    Try 
     BuildConfiguration() 
     CreateTitleObject() 
     CreateRadFilter() 
     LoadDataSource() 
     CreateRadGrid() 
    Catch ex As Exception 
     CreateExceptionDisplay(ex) 
    End Try 

End Sub 

项目模板

Friend Class RadGridCommandItemFilterTemplate 
    Implements ITemplate 

    Protected showHideFilterButton As Button 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn 
     showHideFilterButton = New Button 
     showHideFilterButton.EnableTheming = True 
     showHideFilterButton.ID = "showHideFilterButton" 
     showHideFilterButton.Text = "Show/Hide Filters" 
     showHideFilterButton.CommandName = "ShowHideFilters" 
     showHideFilterButton.OnClientClick = "ShowHideFilters()" 
     container.Controls.Add(showHideFilterButton) 
    End Sub 

End Class 

添加项模板

grid.MasterTableView.CommandItemTemplate = New RadGridCommandItemFilterTemplate 

回答

0

与Telerik的支持,我想出了这个帮助。

项目模板

Friend Class RadGridCommandItemFilterTemplate 
    Implements ITemplate 

    Public showHideFilter As ImageButton 
    Public bannerTitle As Label 

    Private gridClientID As String 
    Private showFilter As Boolean = False 
    Private title As String = String.Empty 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public Sub New(gridClientID As String, showfilter As Boolean, title As String) 
     MyBase.New() 
     Me.gridClientID = gridClientID 
     Me.showFilter = showfilter 
     Me.title = title 
    End Sub 

    Public Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn 

     If Not String.IsNullOrWhiteSpace(title) Then 
      bannerTitle = New Label With {.Text = title, .CssClass = "title"} 
      container.Controls.Add(bannerTitle) 
     End If 

     If showFilter Then 
      showHideFilter = New ImageButton With {.ID = "showHideFilter", 
               .CommandName = "ShowHideFilters", 
               .CssClass = "searchButton"} 

      showHideFilter.Attributes.Add("onclick", (Convert.ToString("setFilter('") & gridClientID) + "'); return false;") 

      container.Controls.Add(showHideFilter) 
     End If 

    End Sub 

End Class 

Java脚本的

<script type="text/javascript"> 

    function pageLoad(sender, args) { 
     setFilter('ConfigureGrid'); 
    } 

    function setFilter(gridClientID) { 
     var grid = $find(gridClientID); 
     if (grid.get_masterTableView().get_isFilterItemVisible()) { 
      grid.get_masterTableView().hideFilterItem(); 
     } 
     else { 
      grid.get_masterTableView().showFilterItem() 
     } 
    } 
</script> 
1

请检查是否有适当的网格ID,如果你使用$ find方法。提供的代码有点混乱,我不确定哪个部分被调用。

在函数getMasterTableView中使用$ find,但你错了我想。此外,如果此功能在JavaScript文件中,则“<%= RadGrid1.ClientID%>”将不会解析为正确的ID。它必须在aspx文件中才能这样做。

在函数ShowHideFilters中使用了错误的函数getElementById将返回不是Telerik的DOM对象。还请注意您的网格有“TestGrid”ID。

更新: 要获取主表,您需要使用find方法。如果你想更通用的解决方案,然后我建议添加简单的CSS类到你的按钮。然后在onLoad事件中为这些按钮添加处理程序。如果您有放置内网jQuery的元素,那么你可以用下面的函数来动态定位网格:

function getParentGrid($element) { 
    var $parentGrid = $element.closest("div.RadGrid"); 
    var parentGridId = $parentGrid[0].id; 
    return window.$find(parentGridId); 
} 
+0

作为组件在运行时从代码中创建的背后,我不能使用$ find方法。没有

+0

我已经更新了答案也许这代码片段将是有益的给你 – Machet

+0

无论如何,一定要设置网格的ID,创建的控件编程需要这些ID,使他们能够回传后装入自己的ViewState。不要让他们的一代机会和框架。 另外,添加一个“返回false”;语句在按钮客户端处理程序,如果你不想它回发(我没有看到处理它的代码,所以我认为这是不需要的,你想要在客户端上完成)。 – rdmptn