2014-03-25 21 views
0

我想對已經加載到DataGridView中的數據實施簡單的快速搜索/ aka過濾器,而不更改數據源。在不更改數據源的情況下過濾DataGridView - null參考錯誤

這是我簡單的用戶界面:

enter image description here

這是我試過(基於答案here)來過濾我的數據:

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

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<Line> 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 as DataTable).DefaultView.RowFilter 
      = string.Format("Sku LIKE '%{0}%'", searchBox.Text); 
    } 
} 

public class Line 
{ 
    public string Sku { get; set; } 
    public int Qty { get; set; } 
} 

當我開始鍵入 「VC」我得到這個錯誤:

System.NullReferenceException was unhandled Message=Object reference not set to an instance of an object.

enter image description here

如何快速搜索/過濾應該工作是這樣的:

  • 如果鍵入「VC」它應該顯示所有3行
  • 如果鍵入「VCF001」,只顯示其行那sku

任何想法我在做什麼錯在這裏?

回答

0

喜歡的東西:

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

這是'在way'修改數據源。難道不能使用DataGridView中的內置'RowFilter'功能?發佈的問題是我的實際代碼的減少版本。在我的真實場景中,數據源是由db查詢填充的DataTable,因此爲什麼我說我不想修改數據源(即爲每個搜索重新排隊)... – Latheesan

+0

我的意思是're-query'不要在上面的回覆中重新排隊...... – Latheesan

+0

那麼你可以嘗試'DataGridView.Select'。 http://stackoverflow.com/questions/2333824/net-framework-datatable-selectstring-method-when-the-filter-expression-contai – heq

0

嘗試使用這樣的事情:

dv.RowFilter = "Sku Like '%" + searchBox.Text + "%' 
相關問題