2016-12-16 43 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()); 
      } 
     } 
    } 
}