2016-12-16 41 views
0

我試圖篩選已綁定到數據集的datagridview一個DataGridView。問題是,當我在我的文本框中輸入數據時,應用程序停止,錯誤是我試圖過濾的列不存在。我試圖使用字符串查詢填充datagridview,並且過濾工作正常,但我無法更新datagridview(我不知道爲什麼)。這就是爲什麼我用數據集而不是查詢填充它。有什麼建議麼?這是我有:過濾綁定到數據集一個文本框C#

DataTable dt = new DataTable("Items"); 
private void LoadDataGrid() 
{ 
using (SqlDataAdapter da = new SqlDataAdapter("SELECT Items.ItemID AS #, Items.SerialNo AS 'SERIALNO', Items.Description AS DESCRIPTION, Items.MaxVoltage, Items.FrameSize, Items.ArrivalDate, Items.DepartureDate, Items.Notes, Items.MechType, Items.[Fix-Drawout], CONCAT(Location.Rack, Location.Row, Location.Columnn, Location.Position) AS LOCATION, ItemStatus.Description AS STATUS, Type.Description AS TYPE, Manufacturers.Description AS MANUFACTURERS FROM Items INNER JOIN Location ON Items.LocationID = Location.LocationID INNER JOIN ItemStatus ON Items.Status = ItemStatus.StatusID INNER JOIN Type ON Items.TypeID = Type.TypeID INNER JOIN Manufacturers ON Items.ManufacturerID = Manufacturers.ManufacturerID", AEAcnn)) 
{ 
da.Fill(dt); 
dataGridView1.DataSource = dt; 
} 
} 

這是我使用的過濾器表達式(與組合框)

private void txtFilter_KeyPress(object sender, KeyPressEventArgs e) 
{ 
if (cmbFilterSearch.Text == "TYPE") 
{ 
DataView dv = dt.DefaultView; 
dv.RowFilter = string.Format("TYPE LIKE '%{0}%'", textBox14.Text); 
dataGridView1.DataSource = dv.ToTable(); 
} 
} 

應用崩潰時,列類型不能被發現,即使名稱實際上是TYPE。

+0

這個問題會更好,如果你包括你的代碼嘗試人們審查。 – silentsod

+0

我的壞!有我的。 –

+0

您尚未顯示您正在使用的過濾器表達式 – stuartd

回答

0

嘗試這樣:

 if (dt.Rows.Count > 0) 
     { 
      string str = string.Format("[TYPE] LIKE '%{0}%'", textBox14.Text.Replace("'", "''")); 
      dt.CaseSensitive = false; 
      DataTable dt1 = dt.Select(str).CopyToDataTable(); 
      dataGridView1.DataSource = dt1; 
     } 
+0

好了,應用程序不會與此崩潰,但現在它不會篩選的事情。 –

+0

我更新了我的答案 –

+0

但是我的搜索需要用組合框過濾, (cmbFilterSearch.Text ==「TYPE」) 但是你沒有在你的答案中加入它,應用程序再次崩潰 –

0

儘管非常規的列名,我看不出有什麼不正確的代碼,如果你正在過去與適配器,這顯然是這樣填寫的數據表因爲直到按鍵事件纔會出現錯誤。由於我們無法看到代碼的整個上下文,因此我懷疑您沒有綁定您認爲自己的數據,或者綁定正在其他地方發生改變,您還沒有注意到。 見this LINQPad script爲證明它的工作原理:

Form frm = new Form(); 
DataTable dt = new DataTable("Items"); 
DataGridView dataGridView1 = new DataGridView(); 
TextBox textBox14 = new TextBox(); 
TextBox cmbFilterSearch = new TextBox(); 

void Main() 
{ 
    PopulateDataTable(dt); 
    BuildForm(frm, dt); 
    Application.Run(frm); 
} 

void BuildForm(Form frm, DataTable dt) 
{ 
    frm.Height = 500; 
    frm.Width = 900; 

    cmbFilterSearch.Text = "TYPE"; 
    frm.Controls.Add(cmbFilterSearch); 

    textBox14.Text = "filter..."; 
    textBox14.Location = new Point(0,50); 
    frm.Controls.Add(textBox14); 
    textBox14.KeyPress += txtFilter_KeyPress; 

    dataGridView1.DataSource = dt; 
    dataGridView1.Location = new Point(0, 80); 
    dataGridView1.AutoGenerateColumns = true; 
    dataGridView1.Width = 800; 
    frm.Controls.Add(dataGridView1); 
} 

void txtFilter_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (cmbFilterSearch.Text == "TYPE") 
    { 
     DataView dv = dt.DefaultView; 
     dv.RowFilter = string.Format("TYPE LIKE '%{0}%'", textBox14.Text); 
     Console.WriteLine(dv.RowFilter); 
     dataGridView1.DataSource = dv.ToTable(); 
    } 
} 

void PopulateDataTable(DataTable dt) 
{ 
    dt.Columns.Add("#", typeof(int)); 
    dt.Columns.Add("'SERIALNO'", typeof(string)); 
    dt.Columns.Add("DESCRIPTION", typeof(string)); 
    dt.Columns.Add("MaxVoltage", typeof(string)); 
    dt.Columns.Add("FrameSize", typeof(string)); 
    dt.Columns.Add("ArrivalDate", typeof(DateTime)); 
    dt.Columns.Add("DepartureDate", typeof(DateTime)); 
    dt.Columns.Add("Notes", typeof(string)); 
    dt.Columns.Add("MechType", typeof(string)); 
    dt.Columns.Add("Fix-Drawout", typeof(string)); 
    dt.Columns.Add("LOCATION", typeof(string)); 
    dt.Columns.Add("STATUS", typeof(string)); 
    dt.Columns.Add("TYPE", typeof(string)); 
    dt.Columns.Add("MANUFACTURERS", typeof(string)); 

    DataRow row = dt.NewRow(); 
    row[0] = 1; 
    row[1] = "9083290823"; 
    row[2] = "Mares eat oats"; 
    row[3] = "12v"; 
    row[4] = "60"; 
    row[5] = DateTime.Now; 
    row[6] = DateTime.Now.AddDays(7); 
    row[7] = "and does eat oats"; 
    row[8] = "and little lambs"; 
    row[9] = "eat ivy."; 
    row[10] = "Cancelled"; 
    row[11] = "KEYWORD"; 
    row[12] = "ACME"; 
    dt.Rows.Add(row); 

    row = dt.NewRow(); 
    row[0] = 2; 
    row[1] = "43537953"; 
    row[2] = "Mares eat oats"; 
    row[3] = "12v"; 
    row[4] = "60"; 
    row[5] = DateTime.Now; 
    row[6] = DateTime.Now.AddDays(7); 
    row[7] = "and does eat oats"; 
    row[8] = "and little lambs"; 
    row[9] = "eat ivy."; 
    row[10] = "Cancelled"; 
    row[11] = "Reserved Word"; 
    row[12] = "Conglomico"; 
    dt.Rows.Add(row); 

    row = dt.NewRow(); 
    row[0] = 3; 
    row[1] = "9083290823"; 
    row[2] = "Mares eat oats"; 
    row[3] = "12v"; 
    row[4] = "60"; 
    row[5] = DateTime.Now; 
    row[6] = DateTime.Now.AddDays(7); 
    row[7] = "and does eat oats"; 
    row[8] = "and little lambs"; 
    row[9] = "eat ivy."; 
    row[10] = "Cancelled"; 
    row[11] = "Identifier"; 
    row[12] = "Enormico"; 
    dt.Rows.Add(row); 

} 
0

嘗試這種方式。

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

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

     private void button1_Click(object sender, EventArgs e) 
     { 
      string connetionString = null; 
      SqlConnection connection ; 
      SqlCommand command ; 
      SqlDataAdapter adapter = new SqlDataAdapter(); 
      DataSet ds = new DataSet(); 
      DataView dv ; 
      string sql = null; 
      connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; 
      sql = "Select * from product"; 
      connection = new SqlConnection(connetionString); 
      try 
      { 
       connection.Open(); 
       command = new SqlCommand(sql, connection); 
       adapter.SelectCommand = command; 
       adapter.Fill(ds, "Filter DataView"); 
       adapter.Dispose(); 
       command.Dispose(); 
       connection.Close(); 

       dv = new DataView(ds.Tables[0], "Product_Price < = 3000", "Product_Name", DataViewRowState.CurrentRows); 

       dataGridView1.DataSource = dv; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show (ex.ToString()); 
      } 
     } 
    } 
}