/// <summary> /// Clones the event and adds it (if necessary) to the project, then runs all enabled filters against it. Returns a string that is null if there was no error, or an error code such as "FILTER ERROR" if there was an error. /// </summary> /// <param name="p">Project to insert the event into.</param> /// <param name="eventOriginal">Event to clone and insert. The event object is not changed by this method.</param> /// <returns>Returns a string that is null if there was no error, or an error code such as "FILTER ERROR" if there was an error.</returns> private SubmitResult InsertIntoProject(Project p, Event eventOriginal) { try { Event ev = JsonConvert.DeserializeObject <Event>(JsonConvert.SerializeObject(eventOriginal)); using (FilterEngine fe = new FilterEngine(p.Name)) { BasicEventTimer bet = fe.AddEventAndRunEnabledFilters(ev); if (Settings.data.verboseSubmitLogging) { Util.SubmitLog(p.Name, "Event " + ev.EventId + " Submission Succeeded\r\n" + bet.ToString("\r\n")); } } PushManager.Notify(p.Name, ev); return(SubmitResult.OK); } catch (FilterException ex) { string timing = "\r\n" + ex.timer.ToString("\r\n"); Util.SubmitLog(p.Name, "Event Submission Failed with FilterException" + timing + "\r\n" + ex.ToString()); Logger.Debug(ex, "FilterEngine Error" + timing); Emailer.SendError(Context, "FilterEngine Error" + timing, ex); return(SubmitResult.FilterError); } catch (Exception ex) { Util.SubmitLog(p.Name, "Event Submission Failed with Exception\r\n" + ex.ToString()); Logger.Debug(ex, "Unhandled exception thrown when inserting event into project \"" + p.Name + "\"."); Emailer.SendError(Context, "Unhandled exception thrown when inserting event into project \"" + p.Name + "\".", ex); return(SubmitResult.FatalError); } }
public void DateTime_LessThanOrEqual() { var builder = new QueryBuilder(); builder.AddClause("BirthDate", new DateTime(1990, 03, 2), Operator.LessThanOrEqual, Connector.And); var engine = new FilterEngine(); var expression = engine.BuildPredicate <Person>(builder.Clauses); var result = Persons.Where(expression); Assert.True(result.Count() == 2); }
public void DateTime_Equals() { var builder = new QueryBuilder(); builder.AddClause("AccountBalance", 1000000098987868767, Operator.Equal, Connector.And); var engine = new FilterEngine(); var expression = engine.BuildPredicate <Person>(builder.Clauses); var result = Persons.Where(expression); Assert.True(result.Count() == 1); }
public ActionResult RunEnabledFiltersAgainstAllEvents() { ProjectRequestBase request = ApiRequestBase.ParseRequest <ProjectRequestBase>(this); if (!request.Validate(out Project p, out ApiResponseBase error)) { return(Json(error)); } using (FilterEngine fe = new FilterEngine(request.projectName)) fe.RunEnabledFiltersAgainstAllEvents(); return(Json(new ApiResponseBase(true))); }
public ActionResult RunFilterAgainstAllEvents() { OneFilterRequest request = ApiRequestBase.ParseRequest <OneFilterRequest>(this); if (!request.Validate(out Project p, out ApiResponseBase error)) { return(Json(error)); } using (FilterEngine fe = new FilterEngine(request.projectName)) fe.RunFilterAgainstAllEvents(request.filterId, true); return(Json(new ApiResponseBase(true))); }
public void Decimal_Equals() { var builder = new QueryBuilder(); builder.AddClause("Debit", 100m, Operator.Equal, Connector.And); var engine = new FilterEngine(); var expression = engine.BuildPredicate <Person>(builder.Clauses); var result = Persons.Where(expression); Assert.True(result.Count() == 1); }
[SetUp] public void SetUp() { _core = new TestCore(); _storage = _core.ResourceStore; CreateNecessaryResources(); _registry = _core.FilterRegistry as FilterRegistry; _engine = _core.FilterEngine as FilterEngine; _wsManager = _core.WorkspaceManager; _unreads = _core.UnreadManager as UnreadManager; _mockResourceTabProvider = _core.GetComponentInstanceOfType( typeof(MockResourceTabProvider) ) as MockResourceTabProvider; _unreads.RegisterUnreadCountProvider( FilterManagerProps.ViewResName, new ViewUnreadCountProvider() ); }
public ActionResult SearchAdvanced() { SearchAdvancedRequest request = ApiRequestBase.ParseRequest <SearchAdvancedRequest>(this); if (!request.Validate(out Project p, out ApiResponseBase error)) { return(Json(error)); } SearchResultsResponse response = new SearchResultsResponse(); using (FilterEngine fe = new FilterEngine(p.Name)) { HashSet <long> readEventIds = new HashSet <long>(fe.db.GetAllReadEventIds(session.GetUser().UserId)); response.events = fe.AdvancedSearch(request.conditions, request.matchAll, request.folderId, session.GetUser().GetEventListCustomTagKey(p.Name)) .Select(ev => ProduceEventSummary(ev, readEventIds)) .ToList(); } return(Json(response)); }
private void Awake() { filterEngine = new FilterEngine(); if (CineastConfiguration.HasConfig()) { CineastConfiguration config = CineastConfiguration.Load(); if (!config.IsEmpty()) { CineastUtils.Configuration = config; } else { CineastUtils.Configuration = CineastConfiguration.GetDefault(); } } else { CineastConfiguration.StoreEmpty(); } _guidHandlerMap = new Dictionary <string, CineastResponseHandler <List <MultimediaObject> > >(); }
public void IsMatch_Equal_And_StringStatement_SimpleStatements_Success() { var builder = new QueryBuilder(); builder.AddClause("Name", "Ana", Operator.Equal, Connector.And); builder.AddClause("Age", 32, Operator.Equal, Connector.Or); var engine = new FilterEngine(); var dictionary = new Dictionary <string, object>(); dictionary.Add("Name", "Ana"); dictionary.Add("Age", 32); var obj = dictionary.BuildTargetObject(); var isValid = engine.Evaluate(obj, builder.Clauses); var expression = engine.BuildPredicate <Person>(builder.Clauses); var result = Persons.Where(expression); Assert.True(result.Count() == 1); }
private void ConfigureDisplayOptions(IResource view, string viewName, IResourceList result) { _displayOptions = new ResourceListDisplayOptions(); _displayOptions.Caption = !String.IsNullOrEmpty(viewName) ? viewName : "Unnamed view"; string deepName = view.GetStringProp("DeepName"); string errorMsg = view.GetStringProp(Core.Props.LastError); if (!String.IsNullOrEmpty(errorMsg)) { _displayOptions.StatusLine = errorMsg; _displayOptions.StatusLineClickHandler = RefreshViewState; _lastErrorView = view; } else if (deepName != Core.FilterRegistry.ViewNameForSearchResults) { if (!view.HasProp("DefaultSort")) { result = SafeSort(result); result.Sort(new SortSettings(Core.Props.Date, false)); } string content = view.GetStringProp(Core.Props.ContentType); if (content == null || content.IndexOf('|') != -1) { _displayOptions.SeeAlsoBar = true; } _displayOptions.DefaultGroupItems = !view.HasProp("DisableDefaultGroupping"); } else { // If we are in the normal mode (Running) - just show the // result to the user. Otherwise, through the chain of two // event handlers, wait until both events take place: // 1. Core is switched to state Running; // 2. Text Index is completely loaded. if (Core.State == CoreState.Running) { _displayOptions.HighlightDataProvider = FilterEngine.Highlighter; _displayOptions.SeeAlsoBar = true; string stopWordsMessage = FilterEngine.VisualizeStopWords(); if (FilterEngine._lastQueryError != null) { _displayOptions.StatusLine = FilterEngine._lastQueryError; } else if (stopWordsMessage.Length > 0) { _displayOptions.StatusLine = stopWordsMessage; } /* [yole] This behavior is unusable. * Use case: Perform a search in a tab where there are no search results for some type. Omea * remembers that the search view was selected. Then the following code switches to the tab where * search results are present. Then, as soon as you try to switch to the original tab again, * the search view is selected again, the following code runs again, and the selection jumps back. * In effect, the original tab becomes unreachable. * * if( view.HasProp( "RunToTabIfSingleTyped" ) ) * { * string[] types = ResourceTypeHelper.GetUnderlyingResourceTypes( result ); * if( types != null && types.Length == 1 ) * { * string tabID = Core.TabManager.FindResourceTypeTab( types[ 0 ] ); * if( tabID != null ) * Core.TabManager.ActivateTab( tabID ); * } * } */ } else { _displayOptions.EmptyText = "Loading information from text index... Please wait or switch to another view."; Core.TextIndexManager.IndexLoaded += ExecSearchViewLateMarshaller; } } }
protected override void Render(HtmlTextWriter writer) { base.Render(writer); System.Text.StringBuilder sb = new System.Text.StringBuilder(); string CAMLQuery = null; try { if (this._listId != null && this._viewName != null) { using (SPSite site = new SPSite(SPContext.Current.Site.Url)) { using (SPWeb web = site.OpenWeb(this.ListWebId)) { SPList selectedList = web.Lists[this._listId]; SPListItemCollection items = selectedList.Items; SPView defaultView = selectedList.Views[this._viewName]; uint itemsPerPage = defaultView.RowLimit; SPViewFieldCollection fields = defaultView.ViewFields; System.Collections.Specialized.StringCollection stringCol = fields.ToStringCollection(); if (Page.Request.QueryString != null && Page.Request.QueryString.Count > 0) { FilterEngine filterEngine = new FilterEngine(Page.Request.QueryString, selectedList); CAMLQuery = filterEngine.CAMLQuery; } // Nik20121105 - Write the table headers; sb.AppendLine("<table class=\"wet-boew-zebra\">"); sb.Append("<tr>"); foreach (string field in stringCol) { sb.Append("<th>" + selectedList.Fields.GetFieldByInternalName(field).Title + "</th>"); } sb.Append("</tr>"); if (CAMLQuery == null) { CAMLQuery = ""; } SPQuery query = new SPQuery(); query.Query = CAMLQuery; query.RowLimit = itemsPerPage; items = selectedList.GetItems(query); if (Page.Request.QueryString["p_ID"] != null) { string prev = ""; if (Page.Request.QueryString["PagedPrev"] == "TRUE") { prev = "&PagedPrev=TRUE"; } SPListItemCollectionPosition position = new SPListItemCollectionPosition("Paged=TRUE&p_ID=" + Page.Request.QueryString["p_ID"] + prev); query.ListItemCollectionPosition = position; } string lastId = ""; foreach (SPListItem item in items) { sb.AppendLine("<tr>"); bool firstCol = true; foreach (string field in stringCol) { if (firstCol) { firstCol = false; string itemUrl = string.Empty; SPField test = item.Fields.TryGetFieldByStaticName("BdcIdentity"); if (test != null) { itemUrl = HttpUtility.UrlEncode(this._listWeb + "/_layouts/listform.aspx?PageType=4&ListId={" + this._listId.ToString() + "}&ID=" + item["BdcIdentity"].ToString()); } else { itemUrl = HttpUtility.UrlEncode(this._listWeb + "/_layouts/listform.aspx?PageType=4&ListId={" + this._listId.ToString() + "}&ID=" + item.ID.ToString()); } string renderedField = string.Empty; if (item[field] != null) { renderedField = item[field].ToString(); } sb.AppendLine("<td><a href=\"" + this.ItemViewerUrl + "?ItemUrl=" + itemUrl + "\">" + renderedField.Replace("string;#", "").Replace("datetime;#", "").Replace("number;#", "") + "</a></td>"); } else { string renderedField = string.Empty; if (item[field] != null) { renderedField = FieldRenderer.RenderField(item[field].ToString(), item.Fields.GetFieldByInternalName(field)); } sb.AppendLine("<td>" + renderedField + "</td>"); } } sb.AppendLine("</tr>"); lastId = item.ID.ToString(); } sb.AppendLine("</table>"); string curUrl = Page.Request.Url.OriginalString; string forwardUrl = curUrl.Replace("p_ID=" + Page.Request.QueryString["p_ID"], "p_ID=" + lastId).Replace("&PagedPrev=TRUE", ""); string prevUrl = curUrl.Replace("p_ID=" + Page.Request.QueryString["p_ID"], "p_ID=" + items[0].ID.ToString()); if (forwardUrl.IndexOf("p_ID") < 0) { if (!forwardUrl.Contains("?")) { forwardUrl += "?p_ID=" + lastId; } else { forwardUrl += "&p_ID=" + lastId; } } if (prevUrl.IndexOf("p_ID") < 0) { if (!prevUrl.Contains("?")) { prevUrl += "?p_ID=" + items[0].ID.ToString(); } else { prevUrl += "&p_ID=" + items[0].ID.ToString(); } } if (!prevUrl.Contains("PagedPrev")) { prevUrl += "&PagedPrev=TRUE"; } if (CAMLQuery != null) { SPQuery newQuery = new SPQuery(); newQuery.Query = CAMLQuery; if (items[0].ID != selectedList.GetItems(newQuery)[0].ID) { sb.AppendLine("<a href=\"" + prevUrl + "\">< Previous</a> "); } } else if (items[0].ID != selectedList.Items[0].ID) { sb.AppendLine("<a href=\"" + prevUrl + "\">< Previous</a> "); } if ((int.Parse(lastId) + itemsPerPage) < selectedList.Items.Count) { sb.AppendLine("<a href=\"" + forwardUrl + "\">Next ></a>"); } writer.Write(sb.ToString()); } } } } catch (Exception ex) { LogEngine.Log(ex, "Accessible Lists"); } }
private void Awake() { logger = LogManager.GetInstance().GetLogger(GetType()); filterEngine = new FilterEngine(); }
public List <VS_CUSTOMERS> GetCustomers(bool search, string txtSearch, string columnName, int filterCount, CustomerType customerType, bool filterIsValidAndOn) { List <VS_CUSTOMERS> lstCustomers = new List <VS_CUSTOMERS>(); Guid currentUserId = AppSettings.GetActiveUserId(); var companyId = AppSettings.GetCompanyId(currentUserId); var prop = typeof(VS_CUSTOMERS).GetProperty(columnName.ToLower(), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); AppSecurityUtil appSecurityUtil = new AppSecurityUtil(); //Filtering is on. if (search) { FilterEngine filter = new FilterEngine(); filter = filter.GetFilterByPropertyType(prop, txtSearch); List <FilterEngine> filters = new List <FilterEngine> { filter }; var filterCriteria = ExpressionBuilder.GetExpression <VS_CUSTOMERS>(filters).Compile(); //SuperAdmin if (appSecurityUtil.ValidateRoles()) { switch (customerType) { case CustomerType.All: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable().AsEnumerable() .Where(filterCriteria) .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; case CustomerType.Private: case CustomerType.Business: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.CustomerTypeId == (int)customerType).AsEnumerable() .Where(filterCriteria) .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; } } else { //Regular users switch (customerType) { case CustomerType.All: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.UserId == currentUserId || (u.IsPrivate == false && u.CompanyId == companyId)).AsEnumerable() .Where(filterCriteria) .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; case CustomerType.Private: case CustomerType.Business: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.UserId == currentUserId && u.CustomerTypeId == (int)customerType || (u.IsPrivate == false && u.CompanyId == companyId && u.CustomerTypeId == (int)customerType)).AsEnumerable() .Where(filterCriteria) .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; } } } else { //No Filtering //SuperAdmin if (appSecurityUtil.ValidateRoles()) { switch (customerType) { case CustomerType.All: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable().AsEnumerable() .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; case CustomerType.Private: case CustomerType.Business: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.CustomerTypeId == (int)customerType).AsEnumerable() .OrderByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; } } else { //Regular users switch (customerType) { case CustomerType.All: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.UserId == currentUserId || (u.IsPrivate == false && u.CompanyId == companyId)).AsEnumerable() .OrderBy(x => x.CustomerCaseNumber) .ThenByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; case CustomerType.Private: case CustomerType.Business: lstCustomers = _repository.GetRepository <VS_CUSTOMERS>().Queryable() .Where(u => u.UserId == currentUserId && u.CustomerTypeId == (int)customerType || (u.IsPrivate == false && u.CompanyId == companyId && u.CustomerTypeId == (int)customerType)).AsEnumerable() .OrderBy(x => x.CustomerCaseNumber) .ThenByDescending(x => x.ModifiedDateTime).Take(filterCount) .ToList(); break; } } } if (filterIsValidAndOn) { if (FilterEngine.GetCurrentFilter != null && FilterEngine.GetCurrentFilter.Count > 0) { var deleg1 = ExpressionBuilder.GetExpression <VS_CUSTOMERS>(FilterEngine.GetCurrentFilter).Compile(); lstCustomers = lstCustomers.Where(deleg1).ToList(); } } return(lstCustomers); }
static void Main(string[] args) { int minStatPercentile = 80; var inventory = new Inventory(@"..\..\..\..\..\my-gear-list-with-mods.json", minStatPercentile, @"S:\"); Console.WriteLine("Pre-computing all build combinations..."); var cacheName = "tactician-striker-electronics"; var start = DateTime.Now; var buildsCount = inventory.GenerateBuildCombinationCache(cacheName); var end = DateTime.Now; Console.WriteLine(string.Format("\nCompleted - created {0} build combinations - ({1} builds/sec)", buildsCount, buildsCount / (end - start).TotalSeconds)); var engine = new FilterEngine(cacheName, 5, @"S:\"); var filters = new List <FilterPipelineStep> { new FilterPipelineStep { Filter = "Lib.UnlockNamedGearSetFilter", Parameters = new Dictionary <string, string>() { { "gearset", "tactician" }, { "min_items", "3" } } }, new FilterPipelineStep { Filter = "Lib.UnlockNamedGearSetFilter", Parameters = new Dictionary <string, string>() { { "gearset", "striker" }, { "min_items", "2" } } }, new FilterPipelineStep { Filter = "Lib.EnsureAtLeastFilter", Parameters = new Dictionary <string, string>() { { "stat", "firearms" }, { "min_value", "3832" } } }, new FilterPipelineStep { Filter = "Lib.EnsureAtLeastFilter", Parameters = new Dictionary <string, string>() { { "stat", "stamina" }, { "min_value", "3832" } } } }; engine.Filters = filters; var sortCriteria = new List <string> { "electronics", "skillhaste" }; engine.SortCriteria = sortCriteria; start = DateTime.Now; var results = engine.Process(); end = DateTime.Now; Console.WriteLine(string.Format("\n Completed searching for optimal builds - ({0} builds/sec)", buildsCount / (end - start).TotalSeconds)); foreach (var res in results) { Console.WriteLine(string.Format("*** Top {0} builds", results.Count())); Console.WriteLine(string.Format("\nElectronics: {0}", res.Stats["electronics"])); Console.WriteLine(string.Format("Armor: {0}", res.Stats["armor"])); Console.WriteLine(string.Format("Skill Haste: {0}", res.Stats["skillhaste"])); Console.WriteLine(string.Format("Firearms: {0}", res.Stats["firearms"])); Console.WriteLine(string.Format("Stamina: {0}", res.Stats["stamina"])); } var resultsFile = string.Format("{0}-results.json", cacheName); Console.WriteLine("Results saved to: {0}", resultsFile); using (var sw = new StreamWriter(resultsFile)) { sw.WriteLine(JsonConvert.SerializeObject(results)); } }
protected override void Render(HtmlTextWriter writer) { base.Render(writer); System.Text.StringBuilder sb = new System.Text.StringBuilder(); string CAMLQuery = null; try { if (this._listId != null && this._viewName != null) { using (SPSite site = new SPSite(SPContext.Current.Site.Url)) { using (SPWeb web = site.OpenWeb(this.ListWebId)) { SPList selectedList = web.Lists[this._listId]; SPListItemCollection items = selectedList.Items; SPView defaultView = selectedList.Views[this._viewName]; uint itemsPerPage = defaultView.RowLimit; SPViewFieldCollection fields = defaultView.ViewFields; System.Collections.Specialized.StringCollection stringCol = fields.ToStringCollection(); if (Page.Request.QueryString != null && Page.Request.QueryString.Count > 0) { FilterEngine filterEngine = new FilterEngine(Page.Request.QueryString, selectedList); CAMLQuery = filterEngine.CAMLQuery; } // Nik20121105 - Write the table headers; sb.AppendLine("<table class=\"wet-boew-zebra\">"); sb.Append("<tr>"); foreach (string field in stringCol) { sb.Append("<th>" + selectedList.Fields.GetFieldByInternalName(field).Title + "</th>"); } sb.Append("</tr>"); if (CAMLQuery == null) { CAMLQuery = ""; } SPQuery query = new SPQuery(); query.Query = CAMLQuery; query.RowLimit = itemsPerPage; items = selectedList.GetItems(query); if (Page.Request.QueryString["p_ID"] != null) { string prev = ""; if (Page.Request.QueryString["PagedPrev"] == "TRUE") prev = "&PagedPrev=TRUE"; SPListItemCollectionPosition position = new SPListItemCollectionPosition("Paged=TRUE&p_ID=" + Page.Request.QueryString["p_ID"] + prev); query.ListItemCollectionPosition = position; } string lastId = ""; foreach (SPListItem item in items) { sb.AppendLine("<tr>"); bool firstCol = true; foreach (string field in stringCol) { if (firstCol) { firstCol = false; string itemUrl = string.Empty; SPField test = item.Fields.TryGetFieldByStaticName("BdcIdentity"); if(test != null) itemUrl = HttpUtility.UrlEncode(this._listWeb + "/_layouts/listform.aspx?PageType=4&ListId={" + this._listId.ToString() + "}&ID=" + item["BdcIdentity"].ToString()); else itemUrl = HttpUtility.UrlEncode(this._listWeb + "/_layouts/listform.aspx?PageType=4&ListId={" + this._listId.ToString() + "}&ID=" + item.ID.ToString()); string renderedField = string.Empty; if (item[field] != null) renderedField = item[field].ToString(); sb.AppendLine("<td><a href=\"" + this.ItemViewerUrl + "?ItemUrl=" + itemUrl + "\">" + renderedField.Replace("string;#", "").Replace("datetime;#", "").Replace("number;#", "") + "</a></td>"); } else { string renderedField = string.Empty; if(item[field] != null) renderedField = FieldRenderer.RenderField(item[field].ToString(), item.Fields.GetFieldByInternalName(field)); sb.AppendLine("<td>" + renderedField + "</td>"); } } sb.AppendLine("</tr>"); lastId = item.ID.ToString(); } sb.AppendLine("</table>"); string curUrl = Page.Request.Url.OriginalString; string forwardUrl = curUrl.Replace("p_ID=" + Page.Request.QueryString["p_ID"], "p_ID=" + lastId).Replace("&PagedPrev=TRUE", ""); string prevUrl = curUrl.Replace("p_ID=" + Page.Request.QueryString["p_ID"], "p_ID=" + items[0].ID.ToString()); if(forwardUrl.IndexOf("p_ID") < 0) { if(!forwardUrl.Contains("?")) forwardUrl += "?p_ID=" + lastId; else forwardUrl += "&p_ID=" + lastId; } if (prevUrl.IndexOf("p_ID") < 0) { if (!prevUrl.Contains("?")) prevUrl += "?p_ID=" + items[0].ID.ToString(); else prevUrl += "&p_ID=" + items[0].ID.ToString(); } if (!prevUrl.Contains("PagedPrev")) prevUrl += "&PagedPrev=TRUE"; if (CAMLQuery != null) { SPQuery newQuery = new SPQuery(); newQuery.Query = CAMLQuery; if(items[0].ID != selectedList.GetItems(newQuery)[0].ID) sb.AppendLine("<a href=\"" + prevUrl + "\">< Previous</a> "); } else if(items[0].ID != selectedList.Items[0].ID) sb.AppendLine("<a href=\"" + prevUrl + "\">< Previous</a> "); if((int.Parse(lastId) + itemsPerPage) < selectedList.Items.Count) sb.AppendLine("<a href=\"" + forwardUrl + "\">Next ></a>"); writer.Write(sb.ToString()); } } } } catch (Exception ex) { LogEngine.Log(ex, "Accessible Lists"); } }