C# 如何使用文本框过滤我的datagirdview?

C# 如何使用文本框过滤我的datagirdview?,c#,C#,如果希望能够进行筛选和排序,则可以如上所述使用SortableList 但是,如果您真的只想进行筛选,那么就这么简单:存储tanks列表,并在筛选器更改时将数据源分配为tanks的子集: using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using project; names

如果希望能够进行筛选和排序,则可以如上所述使用
SortableList

但是,如果您真的只想进行筛选,那么就这么简单:存储tanks列表,并在筛选器更改时将数据源分配为
tanks
的子集:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using project;

namespace project2
{
    class TankClass
    {
        protected bool _isLoaded = false;

        #region Class Property
        public string Tankname { get; set; }
        public int Caliber { get; set; }
        public double Weight { get; set; }
        public double TopSpeed { get; set; }
        public int Armor { get; set; }
        public int Year { get; set; }
        public int Production { get; set; }
        public int CruisingSpeed { get; set; }
        public int TurretTurn { get; set; }
        public string Classification { get; set; }
        public string Era { get; set; }
        public int Crew { get; set; }
 
        public string Country { get; set; }
        public string Faction { get; set; }
       

        #endregion

        #region Constructor(s)

        public TankClass()
        {   
        }

        public TankClass(string concatProps)
        {
            string[] values = concatProps.Split(new char[] { ',' });
            Tankname = values[(int)TankData.Name];
            Caliber = Convert.ToInt32(values[(int)TankData.Cannon]);
            Weight = Convert.ToDouble(values[(int)TankData.Weight]);
            TopSpeed = Convert.ToDouble(values[(int)TankData.TopSpeed]);
            Armor = Convert.ToInt32(values[(int)TankData.Armor]);
            Year = Convert.ToInt32(values[(int)TankData.YearProduced]);
            Production = Convert.ToInt32(values[(int)TankData.Production]);
            CruisingSpeed = Convert.ToInt32(values[(int)TankData.CruisingSpeed]);
            TurretTurn = Convert.ToInt32(values[(int)TankData.TurretTurn]);
            Classification = values [(int)TankData.Classifaction];
            Crew = Convert.ToInt32(values[(int)TankData.Crew]);
            Era = values[(int)TankData.Era];
            Country = values[(int)TankData.NATOorNonNATO];
            Faction = values[(int)TankData.Period];
            _isLoaded = true;
        }
        public TankClass(string tankname, int caliber, float weight, float topSpeed, int armor, int year, int numbers, int cruisingSpeed, int turretTurn, string classification, int crew, string country, string nATOorNotNATO, string timePeriod)
        {
            Tankname = tankname;
            Caliber = caliber;
            Weight = weight;
            TopSpeed = topSpeed;
            Armor = armor;
            Year = year;
            Production = numbers;
            CruisingSpeed = cruisingSpeed;
            TurretTurn = turretTurn;
            Classification = classification;
            Crew = crew;
            Era = country;
            Country = nATOorNotNATO;
            Faction = timePeriod;
            _isLoaded = true;
        }
        #endregion
    }
}

获取空引用异常的原因是由于
(DataGridView.DataSource作为DataTable)
-您的数据源不是DataTable,而是一个
列表。但是,这并不像使用与“只有实现
IBindingListView
接口的基础列表支持过滤”相同的语法来过滤坦克那么简单。
BindingList
似乎没有实现IBindingListView,而且由于它是基础列表,您的集合将不会过滤。”在上面答案的注释中有一个链接,可以将该类用作包装器,在DataGridView中使用
列表进行过滤(和排序),但它已经存档了——我在几年前发布了一个,我在其中使用了类似的情况。顶部有一条注释显示了它是如何使用的。(一旦你有了这些信息-DataGridView、Sort、IBindlingList-你可以找到)但是如果我相信我的长期记忆,我相信我使用的那条最初是由Stack Overflow自己的Marc Gravell编写的-它很容易使用,并且工作得很好,所以我建议这样做。对不起,我对编程有点陌生,所以我有点不知道该做什么,或者再次打扰您,但是我添加了“private List tanks;”和“dataGridView1.DataSource=tanks.Where(t=>t.Tankname.Contains(textBox1.Text,StringComparison.OrdinalIgnoreCase)).ToList();”但我有两个错误,列表中的一个字段表示“字段‘Form1.tanks’从未分配给,并且其默认值始终为null project”,而“t.Tankname.Contains”的错误为“方法‘Contains’的无重载”接受2个参数。字段‘Form1.tanks’从未分配给,但它在LoadData中分配的如上所述?方法“Contains”没有重载,它应该使用2个参数-也许你应该更新问题中的代码?我猜了很多。很抱歉,我忘了提到TanksClass类的几个部分,我会编辑代码让你看到我更新了答案,我没有首先正确测试-很抱歉!我想出来了,但是非常感谢你对我的帮助和耐心,如果我给你带来任何不便,很抱歉,但是再次感谢你。
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using project;

namespace project2
{
    class TankClass
    {
        protected bool _isLoaded = false;

        #region Class Property
        public string Tankname { get; set; }
        public int Caliber { get; set; }
        public double Weight { get; set; }
        public double TopSpeed { get; set; }
        public int Armor { get; set; }
        public int Year { get; set; }
        public int Production { get; set; }
        public int CruisingSpeed { get; set; }
        public int TurretTurn { get; set; }
        public string Classification { get; set; }
        public string Era { get; set; }
        public int Crew { get; set; }
 
        public string Country { get; set; }
        public string Faction { get; set; }
       

        #endregion

        #region Constructor(s)

        public TankClass()
        {   
        }

        public TankClass(string concatProps)
        {
            string[] values = concatProps.Split(new char[] { ',' });
            Tankname = values[(int)TankData.Name];
            Caliber = Convert.ToInt32(values[(int)TankData.Cannon]);
            Weight = Convert.ToDouble(values[(int)TankData.Weight]);
            TopSpeed = Convert.ToDouble(values[(int)TankData.TopSpeed]);
            Armor = Convert.ToInt32(values[(int)TankData.Armor]);
            Year = Convert.ToInt32(values[(int)TankData.YearProduced]);
            Production = Convert.ToInt32(values[(int)TankData.Production]);
            CruisingSpeed = Convert.ToInt32(values[(int)TankData.CruisingSpeed]);
            TurretTurn = Convert.ToInt32(values[(int)TankData.TurretTurn]);
            Classification = values [(int)TankData.Classifaction];
            Crew = Convert.ToInt32(values[(int)TankData.Crew]);
            Era = values[(int)TankData.Era];
            Country = values[(int)TankData.NATOorNonNATO];
            Faction = values[(int)TankData.Period];
            _isLoaded = true;
        }
        public TankClass(string tankname, int caliber, float weight, float topSpeed, int armor, int year, int numbers, int cruisingSpeed, int turretTurn, string classification, int crew, string country, string nATOorNotNATO, string timePeriod)
        {
            Tankname = tankname;
            Caliber = caliber;
            Weight = weight;
            TopSpeed = topSpeed;
            Armor = armor;
            Year = year;
            Production = numbers;
            CruisingSpeed = cruisingSpeed;
            TurretTurn = turretTurn;
            Classification = classification;
            Crew = crew;
            Era = country;
            Country = nATOorNotNATO;
            Faction = timePeriod;
            _isLoaded = true;
        }
        #endregion
    }
}
// 'tanks' is stored as a field when loaded from disk
private List<TankClass> tanks;

protected void LoadData()
{
    tanks = new List<TankClass>();
    string[] lines = File.ReadAllLines(@"C:\Users\bluehalo\Documents\tank chart 2.txt");
            
    for (int i = 0; i < lines.Length; i++)
    {
        TankClass tank = new TankClass(lines[i].ToString());
        tanks.Add(tank);    
    }
    
    dataGridView1.DataSource = tanks;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
    // name contains text
    dataGridView1.DataSource = tanks.Where(t => t.Name.IndexOf(textBox1.Text, StringComparison.OrdinalIgnoreCase) > -1).ToList()
}