2015-11-03 4 views
1

Я пытаюсь создать кнопку, которая принимает 2 пользовательских ввода, а затем фильтрует представление datagridview в зависимости от двух входов. Я использую winforms и Sql. Вот какой код я нашел и попытался реализовать, но он не заполняет datagridview фильтрацией данных.Фильтрация DataGridView Winforms

 private void button3_Click(object sender, EventArgs e) { 
     dataSet31.Personal_Details.Clear(); 
     using (SqlDataAdapter sqlDataAdapter = 
new SqlDataAdapter(sqlCommand2.CommandText = "select * from Personal_Details WHERE '" + comboBox2 + "' LIKE '" + textBox1 + "'", 
    "Data Source=Z46308;Initial Catalog=VSTest;Integrated Security=True")) 
     { 
      using (DataTable dataTable = new DataTable()) 
      { 
       sqlDataAdapter.Fill(dataTable); 
       this.DataGridView01.DataSource = dataTable; 
      } 
     } 
    } 
+0

Если вы загружаете данные в загрузку формы, вам не нужно запускать запрос для фильтрации сетки, вы можете просто использовать 'DataView' для фильтрации таблицы данных. –

+0

Вышеупомянутый подход будет масштабироваться лучше - это означает, что если Personal_Details содержит 100 000 записей, для загрузки DataView потребуется много времени. – rheitzman

ответ

2

При загрузке данных в виде нагрузки, то вы не» t нужно запустить запрос для фильтрации сетки, вы можете просто использовать DataView для фильтрации таблицы данных.

В приведенном ниже примере я полагаю, что вы используете comboBox2, чтобы выбрать имя столбца, которое вы хотите фильтровать на основе.

//Create a data table to store data when you load them in form load 
private DataTable dataTable; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    dataTable = new DataTable(); 
    string constring = @"Data Source=Z46308;Initial Catalog=VSTest;Integrated Security=True"; 
    using (SqlConnection con = new SqlConnection(constring)) 
    { 
     using (SqlDataAdapter sda = new SqlDataAdapter("select * from Personal_Details", con)) 
     { 
      //Fill the data table here 
      sda.Fill(dataTable); 
     } 
    } 
    //Set the data source of grid 
    this.DataGridView01.DataSource = new DataView(dataTable); 
} 
private void button3_Click(object sender, EventArgs e) 
{ 
    //Get the datasource from grid 
    var dv = (DataView)this.DataGridView01.DataSource; 

    //comboBox2.SelectedItem or comboBox2.SelectedValue based on your settings 
    //Apply filter to data source 
    dv.RowFilter = string.Format("{0} Like '%{1}%'",comboBox2.SelectedItem, textBox1.Text); 
} 

EDIT

Вы также можете использовать this.DataGridView01.DataSource = dataTable; установить источник данных, а затем при фильтрации просто использовать dataTable.DefaultView.RowFilter = ....

+0

Это прекрасно работает. Поскольку я новичок, я был бы признателен, если бы вы могли потратить некоторое время, чтобы объяснить, что делает каждая строка. Thanks – imamage597

+0

Зачем вам создавать новый объект DataView? Вы также можете использовать DataTable.DefaultView, верно? – danish

+0

Добро пожаловать :) Я добавлю комментарии к коду, чтобы сделать его более полезным :) –

0

Попробуйте изменить comboBox2 к comboBox2.SelectedValue и textBox1 к TextBox1.Text. Я не думаю, что запрос вернет любые результаты, как у вас есть на данный момент.

Я использую подобную вещь в моем приложении, посмотрите на мой код и посмотреть, если вы можете настроить его в соответствии с вашими потребностями:

SqlCommand cmd = new SqlCommand("SELECT o.OrderID AS ID,o.ProductID AS ProductID, p.ProductName AS 'ProductName', s.CompanyName AS Supplier, c.CategoryName AS Category, o.UnitPrice AS 'Unit Price', o.Quantity AS Quantity, (o.UnitPrice * o.Quantity) AS 'Sub-Total'" + 
      "FROM [Order Details] o INNER JOIN Products p ON o.ProductID = p.ProductID " + 
      "INNER JOIN Suppliers s ON p.SupplierID = s.SupplierID INNER JOIN Categories c ON p.CategoryID = c.CategoryID WHERE OrderID = '" + DropDownList1.SelectedValue + "'", new SqlConnection(ConfigurationManager.ConnectionStrings["databaseConnection1"].ConnectionString)); 
    cmd.Connection.Open(); 
    SqlDataReader sdrEmp = cmd.ExecuteReader(); 
    try 
    { 
     if (sdrEmp.HasRows) 
     { 
      DataTable dt = new DataTable(); 
      dt.Load(sdrEmp); 
      //Response.Write(dt); 
      ViewState["CurrentTable"] = dt; 
      dataGridView1.DataSource = dt; 
      dataGridView1.DataBind();  // BIND DATABASE TABLE WITH THE GRIDVIEW. 
     } 
    } 
+0

Я пропустил это. Это мое плохо, но у меня все еще нет результатов? – imamage597

+0

См. Мой отредактированный ответ. – ArtleMaks

+0

Голые со мной, я просто новобранец, но у меня есть 2 ошибки. ViewState не существует в текущем контексте, и нет определения для Databind в Datagridview? – imamage597

0
private void button2_Click(object sender, EventArgs e) 
    { 
     //dataSet31.Personal_Details.Clear(); 
     SqlCommand cmd = new SqlCommand(); 
     using (SqlDataAdapter sqlDataAdapter = 
new SqlDataAdapter(cmd.CommandText = "select * from vtypes WHERE VoucherType ='" + comboBox1.Text + "' AND VouOrder = '" + textBox1.Text + "'", 
    "Data Source=SQLEXPRESS;Initial Catalog=DB50A0;Integrated Security=True")) 
     { 
      using (DataTable dataTable = new DataTable()) 
      { 
       sqlDataAdapter.Fill(dataTable); 
       this.dataGridView1.DataSource = dataTable; 
      } 
     } 
    } 
1

Вам не нужно, чтобы выполнить запрос на базе всех время. Вот альтернативный подход.

Для фильтрации данных в памяти можно использовать свойство DataView.RowFilter. Как только вы это сделаете, вы можете переустановить данные в свою сетку. Предполагая, что имя объекта таблицы данных table, это то, что вы можете сделать при нажатии кнопки.

 table.DefaultView.RowFilter = combobox1.SelectedText + " LIKE '%" + textbox1.Text + "%'"; 
     dataGridView1.DataSource = null; 
     dataGridView1.DataSource = table.DefaultView; 
+0

Спасибо за ваш комментарий +1 :) –

Смежные вопросы