2016-11-02 21 views
0

ListViewコントロールでジョブの一覧が表示されています。 LinkBut​​tonコントロールの行をクリックすると、ジョブのさまざまなフィールドでリストがソートされます。Filter List List by TextBox by C#

また、ページにTextBoxコントロールとLinkBut​​tonコントロールがあります。

TextBoxでListViewをフィルタリングするキーワードを入力したいとします。 LinkBut​​tonコントロールをクリックすると、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

このようなフィルタを既存のコードに簡単に統合する方法を知りたい場合は、DataBindingの直前にLINQクエリを使用します。

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; 

のは、我々はあなたがそれはあなただけの4つのプロパティの1に対してマッチを含むように設定されたデータをフィルタリングするために使用したい文字列を含む変数filterText持っていると仮定してみましょう:alumniJobDateSubalumniJobCompanyNamealumniJobTitleを、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; 

はあまり大きくなく、あなたはすでに、これは基本的なニーズを満たすために十分行う必要があり、メモリ(キャッシュ)でそれを持っています。

投稿日: 上記の動作は、検索するプロパティのそれぞれが値(nullではない)を特定していることがわかっている場合に機能します。そのうちの1つがnullの場合は、上記のエラーが表示されます。

これを是正するには、そのセクションを変更するので、それぞれの試験は、NULLチェックだけでなく、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

イム私は、文字列filterText =「ウェブを追加する場合、単にテストのために...それを実装しようとしています";あなたのコードのすぐ上にエラーが発生します。System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – fred1234

+0

どの行ですか?あなたはそれがマッチするリストをお探しですか?そうでない場合は、フィルタの結果がないため、エラーが発生する可能性があります。 – egandalf

+0

質問 – fred1234