Hi everyone!
I have created a sharepoint webpart containing a radgrid with a little customized filterchecklist; here's my code.
.aspx page:
.aspx.cs:
as you can see in the attached file there's a little graphical problem (double scroll bar and disallignment of button Apply and button Cancel); how can i solve it using css class ".RadFilterMenu_CheckList" or other way?
Thanks in advance.
Regards Giulio.
I have created a sharepoint webpart containing a radgrid with a little customized filterchecklist; here's my code.
.aspx page:
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %><%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Assembly Name="Telerik.Web.UI, Version=2014.1.403.35, Culture=neutral, PublicKeyToken=121fae78165ba3d4" %><%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %><%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI, Version=2014.1.403.35, Culture=neutral, PublicKeyToken=121fae78165ba3d4" %><%@ Import Namespace="Microsoft.SharePoint" %><%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RadGridWebPartUserControl.ascx.cs" Inherits="CheckListFiltering.RadGridWebPart.RadGridWebPartUserControl" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <style type="text/css"> .HoverClass { background-color: aqua; } .ClickClass { background-color: yellow; } .RadFilterMenu_CheckList { height: 300px; width: 200px; } </style> <script type="text/javascript"> Telerik.Web.UI.RadGrid.prototype._checkListItemsRequestedHandler = function () { var items = $find(this._filterCheckListClientID).get_items(); var count = items.get_count(); for (var i = 0; i < count; i++) { var value = items.getItem(i).get_value().toString(); if (value != "0") items.getItem(i).check(); else items.getItem(i).uncheck(); items.getItem(i).set_value(items.getItem(i).get_text()); } } function RowCreated(sender, eventArgs) { var dataItem = eventArgs.get_gridDataItem(); for (var i = 0; i < dataItem.get_element().cells.length; i++) { dataItem._element.cells[i].onmouseover = function () { this.className = "HoverClass"; } dataItem.get_element().cells[i].onmouseout = function () { var cssName = this.selected ? "ClickClass" : this.defaultStatus; this.className = cssName; return; } dataItem.get_element().cells[i].onclick = function (event) { this.selected = this.selected == true ? false : true; var cssName = this.selected ? "ClickClass" : this.defaultStatus; this.className = cssName; return; } } } </script> <telerik:RadFormDecorator ID="QsfFromDecorator" runat="server" DecoratedControls="All" EnableRoundedCorners="false" /> <telerik:RadGrid runat="server" ID="RadGrid1" AllowFilteringByColumn="true" FilterType="CheckList" EnableLinqExpressions="false" OnNeedDataSource="RadGrid1_NeedDataSource" OnFilterCheckListItemsRequested="RadGrid1_NeedCheckListItems"> <MasterTableView AutoGenerateColumns="false"> <Columns /> </MasterTableView> <ClientSettings> <ClientEvents OnRowCreated="RowCreated" /> </ClientSettings> </telerik:RadGrid>.aspx.cs:
using System;using System.Collections;using System.Collections.Generic;using System.Data;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using Telerik.Web.UI;namespace CheckListFiltering.RadGridWebPart{ public partial class RadGridWebPartUserControl : UserControl { private const int VISIBLE = 1; private const int FILTER = 0; private const int INVISIBLE = -1; private const int UNKNOWN = 99; private static bool Paging; // Paging(true) - Scrolling(false) private static DataTable Data = new DataTable(); // Contenuto della griglia private static DataTable DataFiltered; // Contenuto della griglia filtrata private static int[,] Status; // Struttura ausiliaria utile al riempimento delle "FilterCheckList" // Inizializzazione dello "ScriptManager" (ad ogni caricamento della pagina), dei dati membro e della griglia (solo al caricamento iniziale) protected override void OnInit(EventArgs e) { base.OnInit(e); ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); if (scriptManager == null) { scriptManager = new RadScriptManager(); this.Page.Form.Controls.AddAt(0, scriptManager); } if (Data.Rows.Count == 0) { DataSet Ds = new DataSet(); Ds.ReadXml("C:\\Temp\\App_Data\\data.xml"); // TODO: Read parameter Paging = true; // TODO: Read parameter Data = Ds.Tables[0]; DataFiltered = Data.Select("").Length != 0 ? Data.Select("", Data.Columns[0].ColumnName + " ASC").CopyToDataTable() : new DataTable(); Status = new int[Data.Rows.Count, Data.Columns.Count]; for (int i = 0; i < Data.Rows.Count; i++) for (int j = 0; j < Data.Columns.Count; j++) Status[i, j] = VISIBLE; RadGrid1.Width = 220 * Data.Columns.Count; if (Paging) { RadGrid1.AllowPaging = true; RadGrid1.PagerStyle.AlwaysVisible = true; } else { RadGrid1.ClientSettings.Scrolling.AllowScroll = true; RadGrid1.ClientSettings.Scrolling.ScrollHeight = 300; } for (int i = 0; i < Data.Columns.Count; i++) { GridBoundColumn Column = new GridBoundColumn(); RadGrid1.MasterTableView.Columns.Add(Column); Column.DataField = Data.Columns[i].ColumnName; Column.UniqueName = Data.Columns[i].ColumnName; Column.HeaderText = Data.Columns[i].ColumnName; Column.FilterDelay = 200; Column.FilterCheckListEnableLoadOnDemand = true; } } } // Filtraggio e databinding della griglia protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e) { String filterExpression = Fix_Expression(RadGrid1.MasterTableView.FilterExpression); DataFiltered = Data.Select(filterExpression).Length != 0 ? Data.Select(filterExpression, Data.Columns[0].ColumnName + " ASC").CopyToDataTable() : new DataTable(); Set_Status(filterExpression); RadGrid1.DataSource = DataFiltered; } // Creazione delle "FilterCheckList" public void RadGrid1_NeedCheckListItems(object sender, GridFilterCheckListItemsRequestedEventArgs e) { int col_index = Get_Index(e.Column.UniqueName); DataRow[] dr = Data.Select("", Data.Columns[0].ColumnName + " ASC"); for (int i = 0; i < dr.Length; i++) { if (!Status[i, col_index].Equals(INVISIBLE)) { RadListBoxItem Item = new RadListBoxItem(); Item.Text = Convert.ToString(dr[i][col_index]); Item.Value = Convert.ToString(Status[i, col_index]); bool Found = false; for (int k = 0; k < e.ListBox.Items.Count; k++) { if (e.ListBox.Items[k].Text.Equals(Item.Text)) { Found = true; break; } } if (!Found) e.ListBox.Items.Add(Item); } } } // Utility per la manipolazione della "FilterExpression" public String Fix_Expression(String filterExpression) { String newExpression = ""; for (int i = 0; i < Data.Columns.Count; i++) { if ( RadGrid1.MasterTableView.Columns[i].EvaluateFilterExpression().Contains("=") ) { String expression = RadGrid1.MasterTableView.Columns[i].EvaluateFilterExpression(); String col_name = expression.Substring(expression.IndexOf("[") + 1, expression.IndexOf("]") - expression.IndexOf("[") - 1); String value = expression.Substring(expression.IndexOf("'") + 1, expression.LastIndexOf("'") - expression.IndexOf("'") - 1); filterExpression = filterExpression + " AND ([" + col_name + "] LIKE '" + value + "%')"; } } String[] Expression = filterExpression.Split(new String[] { " AND " }, StringSplitOptions.RemoveEmptyEntries); for (int k = 0; k < Expression.Length; k++) { if (Expression[k].Contains("LIKE")) Expression[k] = Expression[k].Replace("'%", "'"); else { DataRow[] dr = Data.Select("", Data.Columns[0].ColumnName + " ASC"); String col_name = Expression[k].Substring(Expression[k].IndexOf("[") + 1, Expression[k].IndexOf("]") - Expression[k].IndexOf("[") - 1); int col_index = Get_Index(col_name); for (int i = 0; i < Data.Rows.Count; i++) { if (Status[i, col_index].Equals(INVISIBLE)) Expression[k] = Expression[k].Remove(Expression[k].LastIndexOf(")")) + " OR ([" + col_name + "] = '" + Convert.ToString(dr[i][col_index]) + "'))"; } } newExpression = (k != (Expression.Length - 1)) ? newExpression + Expression[k] + " AND " : newExpression + Expression[k]; } return newExpression.Replace("||"," OR "); } // Utility per la modifica di "Status" sulla base del valore della "FilterExpression" public void Set_Status(string filterExpression) { for (int j = 0; j < Data.Columns.Count; j++) { if (!filterExpression.Contains(Data.Columns[j].ColumnName)) { for (int i = 0; i < Data.Rows.Count; i++) Status[i, j] = Status[i, j].Equals(FILTER) ? UNKNOWN : Status[i, j]; } } String[] Expression = filterExpression.Split(new String[] { " AND " }, StringSplitOptions.RemoveEmptyEntries); for (int k = 0; k < Expression.Length; k++) { DataRow[] dr = Data.Select("", Data.Columns[0].ColumnName + " ASC"); String col_name = Expression[k].Substring(Expression[k].IndexOf("[") + 1, Expression[k].IndexOf("]") - Expression[k].IndexOf("[") - 1); int col_index = Get_Index(col_name); if ( !Expression[k].Contains("LIKE") ) { for (int i = 0; i < Data.Rows.Count; i++) { if ( Expression[k].Contains(Convert.ToString("'" + dr[i][col_index] + "'")) ) Status[i, col_index] = Status[i, col_index].Equals(FILTER) ? UNKNOWN : Status[i, col_index]; else Status[i, col_index] = FILTER; } } } for (int i = 0; i < Data.Rows.Count; i++) for (int j = 0; j < Data.Columns.Count; j++) { if (!Is_Filtered(i)) Status[i, j] = VISIBLE; if (Is_Filtered(i) && !Status[i, j].Equals(FILTER)) Fix_Element(i, j); } } // Utility di supporto alla modifica di "Status" public void Fix_Element(int row_index, int col_index) { bool Invisible = true; DataRow[] dr = Data.Select("", Data.Columns[0].ColumnName + " ASC"); for (int i = 0; i < dr.Length; i++) { if (i != row_index && Convert.ToString(dr[i][col_index]).Equals(Convert.ToString(dr[row_index][col_index])) && !Is_Filtered(i)) { Invisible = false; break; } } Status[row_index, col_index] = Invisible ? INVISIBLE : VISIBLE; } // Utility che verifica se una specifica riga della griglia è filtrata o meno public bool Is_Filtered(int index) { for (int j = 0; j < Data.Columns.Count; j++) { if (Status[index, j].Equals(FILTER)) return true; } return false; } // Utility che restituisce l'indice di una colonna della tabella a partire dal suo nome public int Get_Index(String name) { for (int j = 0; j < Data.Columns.Count; j++) { if (Data.Columns[j].ColumnName.Equals(name)) return j; } return -1; } }}as you can see in the attached file there's a little graphical problem (double scroll bar and disallignment of button Apply and button Cancel); how can i solve it using css class ".RadFilterMenu_CheckList" or other way?
Thanks in advance.
Regards Giulio.