2017-01-24 3 views
1

У меня есть combobox, который извлекает данные из select и datagridview, которые извлекают данные из другого запроса. Я хотел бы отфильтровать datagridview, используя значение combobox. Я стараюсь все, но ничего не работает. Не могли бы вы помочь? Более того, почему, когда я объявляю dataview = ((DataTable) datagridview.datasource.defaultview (первая строка в combobox_SelectedIndexChanged), я больше не вижу никаких значений в combobox, вместо этого я вижу System Data DataRowView, но первый вопрос для меня важнее .C# Combobox и DataGridView

private void Form5_Load(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); 
     conn.Open(); 
     SqlCommand sc = new SqlCommand(" SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM bf where customername>'a' order by customername asc, inserted desc ", conn); 
     SqlDataReader reader; 

     reader = sc.ExecuteReader(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("id", typeof(string)); 
     dt.Columns.Add("targ", typeof(string)); 
     dt.Load(reader); 


     comboBox1.ValueMember = "id"; 
     comboBox1.DisplayMember = "targ"; 
     comboBox1.DataSource = dt; 
     conn.Close(); 


     var select = "SELECT [id],[CustomerName[email],[Capital] FROM baf order by id desc"; 
     var c = new SqlConnection("Data Source=xxxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); // Your Connection String here 
     var dataAdapter = new SqlDataAdapter(select, c); 

     var commandBuilder = new SqlCommandBuilder(dataAdapter); 
     var ds = new DataSet(); 
     dataAdapter.Fill(ds); 
     dataGridView1.ReadOnly = true; 
     dataGridView1.DataSource = ds.Tables[0]; 

    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     //var dataView = ((DataTable)dataGridView1.DataSource).DefaultView; 

     // if (comboBox1.Text == "Remove filter") 
     // { 
     //  dataView.RowFilter = string.Empty; 
     // } 
     // else 
     // { 
     //  //dataView.RowFilter = "id = {comboBox1.Text}"; 
     // } 

     //} 

    } 
+0

Пытаясь таким образом: частная пустота comboBox1_SelectedIndexChanged (объект отправителя, EventArgs е) { DataView DV = dataGridView1.DataSource в DataView; dv.RowFilter = "id = [ComboBox1.Text]"; дайте мне ошибку. Ссылка на объект не установлена ​​в экземпляр объекта. И показывает System Data DataRowView в combobox – Diegoctn

+1

Если вы пытаетесь использовать строчную интерполяцию на RowFilter, вам нужно добавить знак доллара: '$ 'id = {comboBox1.Text}" ' Однако вы, вероятно, должны использовать' SelectedValue' , а не 'Текст'. – Crowcoder

+0

private void comboBox1_SelectedIndexChanged var dataView = ((DataTable) dataGridView1.DataSource) .DefaultView; if (comboBox1.Text == "Удалить фильтр") { dataView.RowFilter = string.Empty; } else { dataView.RowFilter = $ "id = {comboBox1.SelectedValue}"; } } Ошибка непредвиденного символа, плюс только вызов назначения, приращение, декремент и новый объект могут использоваться как оператор, недопустимый термин выражения '' } – Diegoctn

ответ

1

вы должны правильно использовать BindingSource для целей Ниже приводится полный рабочий пример чтобы поэкспериментировать с ним, что вам нужно, как в:.

  1. Создайте пустую форму Q1
  2. Добавить один элемент управления DataGridView и один элемент управления ComboBox в форме
  3. Скопируйте и вставьте следующий код в файл Q1.cs
  4. Выполнить и эксперимент

Я надеюсь, что это поможет вам идти хорошо.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WinFormQ 
{ 
    public partial class Q1 : Form 
    { 
     public Q1() 
     { 
      InitializeComponent(); 
     } 

     BindingSource bs; 

     private void Q1_Load(object sender, EventArgs e) 
     { 
      // SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); 
      // conn.Open(); 
      // SqlCommand sc = new SqlCommand(" SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM bf where customername>'a' order by customername asc, inserted desc ", conn); 
      // SqlDataReader reader; 
      // 
      // reader = sc.ExecuteReader(); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("id", typeof(string)); 
      dt.Columns.Add("targ", typeof(string)); 
      // dt.Load(reader); 

      dt.Rows.Add("1", "Targ-1"); // example code - remove 
      dt.Rows.Add("2", "Targ-2"); // example code - remove 
      dt.Rows.Add("3", "Targ-3"); // example code - remove 
      dt.Rows.Add("4", "Targ-4"); // example code - remove 

      comboBox1.ValueMember = "id"; 
      comboBox1.DisplayMember = "targ"; 
      comboBox1.DataSource = dt; 

      // var select = "SELECT [id],[CustomerName[email],[Capital] FROM baf order by id desc"; 
      // var c = new SqlConnection("Data Source=xxxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); Your Connection String here 
      // var dataAdapter = new SqlDataAdapter(select, c); 

      // var commandBuilder = new SqlCommandBuilder(dataAdapter); 

      DataSet ds = new DataSet(); 
      DataTable bf = new DataTable("BF"); 
      bf.Columns.Add("id", typeof(string)); // example code - remove 
      bf.Columns.Add("CustomerName", typeof(string)); // example code - remove 
      bf.Columns.Add("Email", typeof(string)); // example code - remove 
      bf.Columns.Add("Capital", typeof(string)); // example code - remove 

      ds.Tables.Add(bf); 
      bs = new BindingSource(ds, "BF"); 
      // dataAdapter.Fill(bf); 

      bf.Rows.Add("1", "Customer-1", "Email-1", "Capital-1"); // example code - remove 
      bf.Rows.Add("1", "Customer-2", "Email-2", "Capital-1"); // example code - remove 
      bf.Rows.Add("2", "Customer-3", "Email-3", "Capital-2"); // example code - remove 
      bf.Rows.Add("3", "Customer-4", "Email-4", "Capital-3"); // example code - remove 
      bf.Rows.Add("3", "Customer-5", "Email-5", "Capital-3"); // example code - remove 
      bf.Rows.Add("3", "Customer-6", "Email-6", "Capital-3"); // example code - remove 
      bf.Rows.Add("4", "Customer-7", "Email-7", "Capital-4"); // example code - remove 
      dataGridView1.ReadOnly = true; 
      dataGridView1.DataSource = bs; 

      this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged); 
     } 

     void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox1.Text == "Remove filter") 
      { 
       bs.RemoveFilter(); 
      } 
      else if (comboBox1.SelectedValue == null) 
      { 
       bs.RemoveFilter(); 
      } 
      else 
      { 
       bs.Filter = "id = " + comboBox1.SelectedValue; 
      } 
     } 

    } 
} 
+0

Спасибо, действительно, Rupesh, но где я должен поместить BindingSource bs; ? Я поместил его после класса Public Partial, но используя свой код, который я извлекаю. Невозможно создать объект типа «System.Windows.Forms.BindingSource», чтобы ввести «System.Data.DataTable». – Diegoctn

+0

Объявить 'BindingSource bs;' непосредственно перед методом Form5_Loan(). Что касается вопроса о выпуске, я хотел бы узнать, какая строка кода вызывает эту ошибку? – Rupesh

+0

Я изменил положение BindingSource bs, все еще System.Data.Systemdatarows в моем комбо, плюс ошибка. Не удалось наложить объект типа «System.Windows.Forms.BindingSource» на тип «System.Data.DataTable». в строке 75: var dataView = ((DataTable) dataGridView1.DataSource) .DefaultView; – Diegoctn

0

Я решил таким образом (возможно, не самый элегантный, но он работает):

private void Form5_Load(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); 
     conn.Open(); 
     SqlCommand sc = new SqlCommand(" SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM baf where customername>'a' order by customername asc, inserted desc ", conn); 
     SqlDataReader reader; 

     reader = sc.ExecuteReader(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("id", typeof(string)); 
     dt.Columns.Add("targ", typeof(string)); 
     dt.Load(reader); 


     comboBox1.ValueMember = "id"; 
     comboBox1.DisplayMember = "targ"; 
     comboBox1.DataSource = dt; 
     conn.Close(); 



     var select = "SELECT [id],[CustomerName], [email],[CapActual] FROM baf order by id desc"; 
     var c = new SqlConnection("Data Source=xxxx;Initial Catalog=xxxxx;Integrated Security=True;"); // Your Connection String here 
     var dataAdapter = new SqlDataAdapter(select, c); 

     var commandBuilder = new SqlCommandBuilder(dataAdapter); 
     var ds = new DataSet(); 
     var bf = new DataTable("BF"); 
     ds.Tables.Add(bf); 

     dataAdapter.Fill(bf); 
     dataGridView1.ReadOnly = true; 
     dataGridView1.DataSource = bf; 






    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 



     var select = "SELECT [id],[CustomerName],[email],[CapActual] FROM baf where id="+comboBox1.SelectedValue+" order by id desc"; 
     var c = new SqlConnection("Data Source=xxxxx;Initial Catalog=xxxxxx;Integrated Security=True;"); // Your Connection String here 
     var dataAdapter = new SqlDataAdapter(select,c); 

     var commandBuilder = new SqlCommandBuilder(dataAdapter); 
     var ds = new DataSet(); 
     var bf = new DataTable("BF"); 
     ds.Tables.Add(bf); 

     dataAdapter.Fill(bf); 
     dataGridView1.ReadOnly = true; 
     dataGridView1.DataSource = bf; 










    } 

    } 




    } 
0

Для зрителей, которые заинтересованы в поиске, как сделать код в вопросе работы успешно, я представим решение ниже. Для обеспечения готовности к эксперименту данные жестко закодированы, что необходимо изменить в соответствии с реальной ситуацией.

DataView dataView = null; // <<< Difference #1 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     var dt = new DataTable(); 
     dt.Columns.Add("id", typeof(string)); 
     dt.Columns.Add("targ", typeof(string)); 

     dt.Rows.Add("1", "Targ-1"); // example code - remove 
     dt.Rows.Add("2", "Targ-2"); // example code - remove 
     dt.Rows.Add("3", "Targ-3"); // example code - remove 
     dt.Rows.Add("4", "Targ-4"); // example code - remove 

     comboBox1.ValueMember = "id"; 
     comboBox1.DisplayMember = "targ"; 
     comboBox1.DataSource = dt; 

     var bf = new DataTable("BF"); 
     bf.Columns.Add("id", typeof(string)); // example code - remove 
     bf.Columns.Add("CustomerName", typeof(string)); // example code - remove 
     bf.Columns.Add("Email", typeof(string)); // example code - remove 
     bf.Columns.Add("Capital", typeof(string)); // example code - remove 

     bf.Rows.Add("1", "Customer-1", "Email-1", "Capital-1"); // example code - remove 
     bf.Rows.Add("1", "Customer-2", "Email-2", "Capital-1"); // example code - remove 
     bf.Rows.Add("2", "Customer-3", "Email-3", "Capital-2"); // example code - remove 
     bf.Rows.Add("3", "Customer-4", "Email-4", "Capital-3"); // example code - remove 
     bf.Rows.Add("3", "Customer-5", "Email-5", "Capital-3"); // example code - remove 
     bf.Rows.Add("3", "Customer-6", "Email-6", "Capital-3"); // example code - remove 
     bf.Rows.Add("4", "Customer-7", "Email-7", "Capital-4"); // example code - remove 
     dataGridView1.ReadOnly = true; 
     dataGridView1.DataSource = bf; 

     dataView = bf.DefaultView; // <<< Difference #2 
     this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged); // <<< Difference #3 
    } 

    void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (comboBox1.Text == "Remove filter") 
     { 
      dataView.RowFilter = string.Empty; 
     } 
     else 
     { 
      dataView.RowFilter = string.Format("id = '{0}'", comboBox1.SelectedValue); // <<< Difference #4 
     } 

    } 

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

  • Нет связанных вопросов^_^