【问题标题】:Filter ListView by TextBox with C#使用 C# 通过 TextBox 过滤 ListView
【发布时间】:2016-11-02 17:02:12
【问题描述】:

我有一个显示作业列表的 ListView 控件。我有一排 LinkBut​​ton 控件,单击时会按作业的各个字段对列表进行排序。

我在页面上还有一个 TextBox 控件和 LinkBut​​ton 控件。

我想在 TextBox 中输入一个关键字来过滤 ListView。单击 LinkBut​​ton 控件后,ListView 过滤器将仅显示关键字包含在我们排序依据的 4 种模式之一中的结果(日期、公司、标题、位置)。

这里没有包含其他代码和类,而且我是 C# 新手,所以如果我遗漏了需要的部分,请告诉我。

文本框:

<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);
        }

    }
}

视图模型:

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;
        }
    }
}

【问题讨论】:

    标签: c# asp.net listview filter ektron


    【解决方案1】:

    如果您想要一种将此类过滤器轻松集成到现有代码中的方法,我会在 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;
    

    现在假设我们有一个变量filterText,其中包含您要用于过滤数据集的字符串,以便它只包含与您的四个属性之一的匹配项:alumniJobDateSubalumniJobCompanyName、@ 987654325@, 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();
    }
    

    【讨论】:

    • 我正在尝试实现它.. 只是为了测试如果我添加字符串 filterText = "web";在您的代码上方,我收到错误 System.NullReferenceException: Object reference not set to an instance of an object。
    • 在哪一行?你有匹配的列表吗?如果没有,可能会因为过滤器没有结果而抛出错误。
    • 堆栈跟踪添加到问题底部
    • 您的职位中有一个字段为空。这意味着在至少一个记录中,日期、公司名称、标题或位置为空。因此,您可能需要在上述条件下添加一个空检查。例如:
    • (x.alumniJobDateSub != null && x.alumniJobDateSub.IndexOf(filterText, 0, StringComparison.CurrentCultureIgnoreCase) > -1)
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多