2016-11-02 3 views
0

У меня есть элемент управления ListView, который отображает список заданий. У меня есть строка элементов управления LinkButton, которая при нажатии сортирует список по различным полям задания.Фильтр ListView по TextBox с C#

У меня также есть элемент управления TextBox и LinkButton Control на странице.

Я хочу ввести ключевое слово, чтобы отфильтровать ListView в текстовом поле. При нажатии кнопки LinkButton Control в элементе ListView отображаются только те результаты, которые содержат ключевое слово, содержащееся в одном из 4 режимов, которые мы сортируем по (дата, компания, название, местоположение).

Существует другой код и классы, которые я здесь не включен, и я новичок в C#, поэтому дайте мне знать, если я оставил часть, которая необходима.

TextBox:

<asp:TextBox ID="txtKeySearch" CssClass="form-control" runat="server" /> 

Кнопка:

<asp:LinkButton ID="lnkbtnKeySearch" runat="server" class="fancy" > 
<span>Search <span class="ico-chevron-right"></span></span></asp:LinkButton> 

Код За:

using Ektron.Custom.SmartForms; 
using Ektron.Custom.ViewModels; 
using System; 
using System.Collections.Generic; 
using System.Linq; 

public partial class Source_Controls_Alumni_AlumniJobListing : System.Web.UI.UserControl 
{ 

    // Added Property 
    private long _containerId = 0; 
    public long ContainerID 
    { 
     get { return _containerId; } 
     set { _containerId = value; } 
    } 
    ///////// 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      LoadData(AJVMCompareMode.Date, AJVMSortOrder.ASC); 
     } 
    } 
    private void LoadData(AJVMCompareMode mode, AJVMSortOrder sort) 
    { 
     // Added inverted conditional to escape method 
     // if the _containerId is invalid. 
     if (_containerId <= 0) return; 
     /////////// 

     var alumniJobPostManager = new AlumniJobPostManager(); 

     // Whichever folder Id... 
     var jobs = alumniJobPostManager.GetList(_containerId); 

     if (jobs != null && jobs.Any()) 
     { 
      List<AlumniJobPostViewModel> lst = new List<AlumniJobPostViewModel>(jobs); 
      AlumniJobPostViewModel.Mode = mode; 
      AlumniJobPostViewModel.SortOrder = sort; 
      lst.Sort(); 
      uxPhotoGallery.DataSource = lst; 
      uxPhotoGallery.DataBind(); 
      lblCount.Text = "" + uxPhotoGallery.Items.Count; 
     } 
    } 
    protected void lnkBtnCompany_Click(object sender, EventArgs e) 
    { 
     if (AlumniJobPostViewModel.Mode != AJVMCompareMode.Company || AlumniJobPostViewModel.SortOrder == AJVMSortOrder.DESC) 
     { 
      LoadData(AJVMCompareMode.Company, AJVMSortOrder.ASC); 
     } 
     else 
     { 
      LoadData(AJVMCompareMode.Company, AJVMSortOrder.DESC); 
     } 

    } 
    protected void lnkBtnTitle_Click(object sender, EventArgs e) 
    { 
     if (AlumniJobPostViewModel.Mode != AJVMCompareMode.Title|| AlumniJobPostViewModel.SortOrder == AJVMSortOrder.DESC) 
     { 
      LoadData(AJVMCompareMode.Title, AJVMSortOrder.ASC); 
     } 
     else 
     { 
      LoadData(AJVMCompareMode.Title, AJVMSortOrder.DESC); 
     } 

    } 
    protected void lnkBtnLocation_Click(object sender, EventArgs e) 
    { 
     if (AlumniJobPostViewModel.Mode != AJVMCompareMode.Location || AlumniJobPostViewModel.SortOrder == AJVMSortOrder.DESC) 
     { 
      LoadData(AJVMCompareMode.Location, AJVMSortOrder.ASC); 
     } 
     else 
     { 
      LoadData(AJVMCompareMode.Location, AJVMSortOrder.DESC); 
     } 

    } 
} 

ViewModel:

using System; 
using System.Collections; 

namespace Ektron.Custom.ViewModels 
{ 
    public enum AJVMCompareMode 
    { 
     Date, 
     Company, 
     Title, 
     Location 
    } 
    public enum AJVMSortOrder 
    { 
     ASC, 
     DESC 
    } 


    /// <summary> 
    /// Provides the fields necessary to display a PressPhoto Smart Form to the site. 
    /// </summary> 
    public class AlumniJobPostViewModel : IComparable<AlumniJobPostViewModel> 
    { 
     static public AJVMCompareMode Mode { get; set; } 
     static public AJVMSortOrder SortOrder { get; set; } 
     public int CompareTo(AlumniJobPostViewModel other) 
     { 
      switch (Mode) 
      { 
       case AJVMCompareMode.Date: 
        if (SortOrder == AJVMSortOrder.ASC) 
        { 
         return (this.alumniJobDateSub.CompareTo(other.alumniJobDateSub)); 
        } 
        else 
        { 
         return (other.alumniJobDateSub.CompareTo(this.alumniJobDateSub)); 
        } 
       case AJVMCompareMode.Company: 
        if (SortOrder == AJVMSortOrder.ASC) 
        { 
         return (this.alumniJobCompany.CompareTo(other.alumniJobCompany)); 
        } 
        else 
        { 
         return (other.alumniJobCompany.CompareTo(this.alumniJobCompany)); 
        } 
       case AJVMCompareMode.Title: 
        if (SortOrder == AJVMSortOrder.ASC) 
        { 
         return (this.alumniJobTitle.CompareTo(other.alumniJobTitle)); 
        } 
        else 
        { 
         return (other.alumniJobTitle.CompareTo(this.alumniJobTitle)); 
        } 
       case AJVMCompareMode.Location: 
        if (SortOrder == AJVMSortOrder.ASC) 
        { 
         return (this.alumniJobLocation.CompareTo(other.alumniJobLocation)); 
        } 
        else 
        { 
         return (other.alumniJobLocation.CompareTo(this.alumniJobLocation)); 
        } 
      } 
      return 0; 
     } 
     public string ContentUrl { get; set; } 
     public long ContentId { get; set; } 
     public bool alumniJobPostExtranet { get; set; } 
     public string alumniJobDateSub { get; set; } 
     public string alumniJobClientNum { get; set; } 
     public string alumniJobContactAtt1 { get; set; } 
     public string alumniJobContactAtt2 { get; set; } 
     public string alumniJobTitle { get; set; } 
     public string alumniJobCompany { get; set; } 
     public string alumniJobLocation { get; set; } 
     public string alumniJobDescription { get; set; } 
     public string alumniJobCompanyName { get; set; } 
     public string alumniJobContactName { get; set; } 
     public string alumniJobContactEmail { get; set; } 
     public string alumniJobContactPhone { get; set; } 
     public AlumniJobPostViewModel() 
     { 

     } 
     static AlumniJobPostViewModel() 
     { 
      Mode = AJVMCompareMode.Date; 
      SortOrder = AJVMSortOrder.ASC; 
     } 
    } 
} 

ответ

0

Если вам нужен способ легко интегрировать такой фильтр в существующий код, я бы пошел с запросом LINQ прямо перед DataBinding.

Предполагая, что вы можете получить значение и сделать его доступным для вашего метода LoadData с помощью санитарии и без помощи, давайте посмотрим на ваш код, который привязывает данные к элементу управления.

List<AlumniJobPostViewModel> lst = new List<AlumniJobPostViewModel>(jobs); 
AlumniJobPostViewModel.Mode = mode; 
AlumniJobPostViewModel.SortOrder = sort; 
lst.Sort(); 
uxPhotoGallery.DataSource = lst; 
uxPhotoGallery.DataBind(); 
lblCount.Text = "" + uxPhotoGallery.Items.Count; 

Теперь давайте предположим, что мы имеем переменную filterText, которая содержит строку, которую вы хотите использовать для фильтрации данных, установленных таким образом, что она включает в себя только матчи против одного из ваших четырех свойств: alumniJobDateSub, alumniJobCompanyName, alumniJobTitle, alumniJobLocation ,

List<AlumniJobPostViewModel> lst = new List<AlumniJobPostViewModel>(jobs); 
AlumniJobPostViewModel.Mode = mode; 
AlumniJobPostViewModel.SortOrder = sort; 
lst.Sort(); 

// Filtering code 
lst = lst.Where(x => 
    (x.alumniJobDateSub.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
    (x.alumniJobCompanyName.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
    (x.alumniJobTitle.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
    (x.alumniJobLocation.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1)).ToList(); 


uxPhotoGallery.DataSource = lst; 
uxPhotoGallery.DataBind(); 
lblCount.Text = "" + uxPhotoGallery.Items.Count; 

Предполагая, что список не является слишком большим, и у вас уже есть в памяти (кэш) это должно выполнять достаточно хорошо, чтобы удовлетворить основные потребности.

Вышеупомянутое работает, если вы уверены, что каждое из свойств, которые вы будете искать, имеет значение (не пустое). Если один из них равен нулю, вы увидите вышеприведенную ошибку.

Чтобы исправить это, изменить эту секцию, так что каждый тест имеет нулевой чек, а также поиск IndexOf:

if (!string.IsNullOrEmpty(filterText)) 
{ 
    lst = lst.Where(x => 
     (x.alumniJobDateSub != null && x.alumniJobDateSub.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
     (x.alumniJobCompanyName != null && x.alumniJobCompanyName.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
     (x.alumniJobTitle != null && x.alumniJobTitle.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1) || 
     (x.alumniJobLocation != null && x.alumniJobLocation.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1)).ToList(); 
} 
+0

Im пытается реализовать .. только для тестирования, если добавить строку filterText = «Интернет «; прямо над вашим кодом Я получаю ошибку System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. – fred1234

+0

На какой линии? Есть ли у вас какие-либо записи, где это матч? Если нет, это может вызвать ошибку, потому что результатов фильтра нет. – egandalf

+0

Stack Trace добавлен в нижней части вопроса – fred1234