C# 在不更改数据源的情况下筛选DataGridView-空引用错误

C# 在不更改数据源的情况下筛选DataGridView-空引用错误,c#,datagridview,filtering,C#,Datagridview,Filtering,我想对已经加载到DataGridView中的数据实现一个简单的快速搜索/aka过滤器,而不改变数据源 这是我的简单用户界面: 这是我尝试筛选数据的方式(基于答案): 公共部分类表单1:表单 { 公共表格1() { 初始化组件(); } 私有void Form1\u加载(对象发送方、事件参数e) { 列表myline=新列表() { 新行(){Sku=“VCF001”,数量=1}, 新行(){Sku=“VCF002”,数量=1}, 新行(){Sku=“VCF003”,数量=1}, }; data

我想对已经加载到DataGridView中的数据实现一个简单的快速搜索/aka过滤器,而不改变数据源

这是我的简单用户界面:

这是我尝试筛选数据的方式(基于答案):

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
列表myline=新列表()
{
新行(){Sku=“VCF001”,数量=1},
新行(){Sku=“VCF002”,数量=1},
新行(){Sku=“VCF003”,数量=1},
};
dataGridView1.DataSource=myLines;
}
私有无效搜索框\u text已更改(对象发送方,事件参数e)
{
(dataGridView1.DataSource作为DataTable)。DefaultView.RowFilter
=string.Format(“类似Sku的“{0}%”,searchBox.Text);
}
}
公共班级线
{
公共字符串Sku{get;set;}
公共整数数量{get;set;}
}
当我开始键入“VC”时,出现以下错误:

System.NullReferenceException未处理消息=对象引用 未设置为对象的实例

快速搜索/筛选的工作原理如下:

dv.RowFilter = "Sku Like '%" + searchBox.Text + "%'
  • 如果我输入“VC”,它应该显示所有3行
  • 如果我输入“VCF001”,它应该只显示具有该sku的行
知道我做错了什么吗?

类似于:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<Line> myLines {get;set;}

    private void Form1_Load(object sender, EventArgs e)
    {
        myLines = new List<Line>()
        {
            new Line() { Sku = "VCF001", Qty = 1 },
            new Line() { Sku = "VCF002", Qty = 1 },
            new Line() { Sku = "VCF003", Qty = 1 },
        };
        dataGridView1.DataSource = myLines;
    }

    private void searchBox_TextChanged(object sender, EventArgs e)
    {
        dataGridView1.DataSource = myLines.Where(l => l.Sku.ToLower().Contains(searchBox.Text.ToLower())).ToList();

    }
}

public class Line
{
    public string Sku { get; set; }
    public int Qty { get; set; }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
列表myline{get;set;}
私有void Form1\u加载(对象发送方、事件参数e)
{
myLines=新列表()
{
新行(){Sku=“VCF001”,数量=1},
新行(){Sku=“VCF002”,数量=1},
新行(){Sku=“VCF003”,数量=1},
};
dataGridView1.DataSource=myLines;
}
私有无效搜索框\u text已更改(对象发送方,事件参数e)
{
dataGridView1.DataSource=myLines.Where(l=>l.Sku.ToLower().Contains(searchBox.Text.ToLower()).ToList();
}
}
公共班级线
{
公共字符串Sku{get;set;}
公共整数数量{get;set;}
}

尝试使用以下方法:

dv.RowFilter = "Sku Like '%" + searchBox.Text + "%'

这在某种程度上是修改数据源的
。不能使其与DataGridView上的内置
RowFilter
功能一起工作吗?张贴的问题是我实际代码的精简版本。在我的真实场景中,数据源是一个由db查询填充的数据表,因此我说我不想修改数据源(即为每次搜索重新排队)…因此您可以尝试
DataGridView。然后选择