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