2017-01-24 3 views
1

Ich habe eine Combobox, die Daten aus einer Auswahl und einer Datagridview abrufen, die Daten von einer anderen Abfrage abrufen. Ich möchte die Datagridview mit dem Comboboxvalue filtern. Ich versuche alles, aber nichts funktioniert. Kannst du bitte helfen? Außerdem, warum, wenn ich dataview = ((DataTable) datagridview.datasource.defaultview (erste Zeile in combobox_SelectedIndexChanged) deklariere ich kann keine Werte in der Combobox mehr sehen, stattdessen sehe ich System DataRowView, aber die erste Frage ist wichtiger für mich .C# Combobox und 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

auf diese Weise versuchen, private void ComboBox1_SelectedIndexChanged (object sender, EventArgs e) { Dataview dv = dataGridView1.DataSource als Dataview; dv.RowFilter = "ID = [ComboBox1.Text]"; geben Sie mir den Fehler Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. Und zeigt Systemdaten DataRowView in der Combobox – Diegoctn

+1

Wenn Sie versuchen, String-Interpolation auf dem RowFilter zu verwenden, müssen Sie ein Dollarzeichen vorangestellt wird: '$„id = {comboBox1.Text}“' Allerdings sollten Sie wahrscheinlich 'SelectedValue' verwenden , nicht 'Text'. – Crowcoder

+0

private void comboBox1_SelectedIndexChanged var dataView = ((DataTable) dataGridView1.DataSource) .DefaultView; if (comboBox1.Text == "Filter entfernen") { dataView.RowFilter = string.Empty; } sonst { dataView.RowFilter = $ "id = {comboBox1.SelectedValue}"; } Fehler unerwartetes Zeichen, plus nur Zuweisung Anruf, Inkrement, Dekrement und neues Objekt kann als Anweisung verwendet werden, ungültiger Ausdruck Begriff ' – Diegoctn

Antwort

1

Sie müssen richtig zum Zweck Binding verwenden im Folgenden finden Sie die komplette Arbeitsbeispiel, mit ihm zu experimentieren, was Sie brauchen, wie unter ist. Q1

  1. erstellen Sie ein leeres Formular
  2. hinzufügen ein DataGridView-Steuerelement und ein ComboBox-Steuerelement in dem Formular
  3. Kopieren und fügen Sie ihn Code in Q1.cs
  4. Run-Datei und

Ich experimentiere hoffen, dass diese Sie gehen gut zu bekommen.

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

Danke in der Tat Rupesh aber wo sollte ich die BindingSource bs setzen; ? Ich habe nach der Public Partial-Klasse gesetzt, aber benutze den Code, den ich abrufen kann, um Objekt des Typs 'System.Windows.Forms.BindingSource' in 'System.Data.DataTable' umzuwandeln. – Diegoctn

+0

"BindingSource bs;" kurz vor der Form5_Loan() -Methode deklarieren. In Bezug auf Cast Ausgabe möchte ich wissen, welche Codezeile diesen Fehler erzeugt? – Rupesh

+0

Ich änderte die BindingSource-Position bs, immer noch System.Data.Systemdatarows in meiner Combo plus Fehler Kann nicht Objekt des Typs 'System.Windows.Forms.BindingSource' in den Typ 'System.Data.DataTable' zu werfen. in der Zeile 75: var dataView = ((DataTable) dataGridView1.DataSource) .DefaultView; – Diegoctn

0

ich auf diese Weise gelöst (vielleicht nicht die eleganteste, aber es funktioniert):

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

Für die Zuschauer, die bei der Suche interessiert sind, wie Sie den Code in Frage Arbeit erfolgreich zu machen, ich präsentiere die folgende Lösung. Um die Experimentierfreudigkeit zu erreichen, sind die Daten fest codiert, die entsprechend der tatsächlichen Situation modifiziert werden müssen.

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 
     } 

    } 
Verwandte Themen