2016-05-12 13 views
0

Ich bin eine Anwendung erstellen, die WPF verwendet, wo eine Suchzeichenfolge eine Datagridview filtern wird, aber mehrere Suchzeichenfolgen enthalten kann. Ich habe versucht, unten eine Filterfunktion zu erstellen, aber es funktioniert nicht ganz am letzten Bit, wo ich die Sichtbarkeit festlege. Kannst du mir bitte helfen zu verstehen, wo ich falsch gelaufen bin? DankWPF Foreach Row Sichtbarkeitsgruppe

private void BindGrid(string parameter) 
    { 
     string[] array = parameter.Split(); 
     string constring = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\SearchTable.mdf;Integrated Security=True;Connect Timeout=30"; 
     using (SqlConnection con = new SqlConnection(constring)) 
     { 
      con.Open(); 
      using (SqlCommand cmd = new SqlCommand("SELECT * FROM Projects", con)) 
      { 
       cmd.CommandType = CommandType.Text; 
       using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
       { 
        using (DataTable dt = new DataTable()) 
        { 
         sda.Fill(dt); 
         dataGridView1.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = dt }); 

         foreach (DataRow row in dt.Rows) 
         { 
          SqlDataReader reader = cmd.ExecuteReader(); 
          if (reader.HasRows) 
          { 
           while (reader.Read()) 
           { 
            int index = reader.GetInt32(0); 
            string a = reader.GetString(1); 
            string b = reader.GetString(2); 
            string c = reader.GetString(3); 
            string d = reader.GetString(4); 
            string e = reader.GetString(5); 
            string f = reader.GetString(6); 
            string g = reader.GetString(7); 
            string h = reader.GetString(8); 
            string i = reader.GetString(9); 
            string j = reader.GetString(10); 
            string t = a + " " + b + " " + c + " " + d + " " + e + " " + f + " " + g + " " + h + " " + i + " " + j; 

            foreach (string value in array) 
            { 
             if (t.IndexOf(value, StringComparison.CurrentCulture) == -1) 
             { 
              row.Visibility = Visibility.Collapsed; 
             } 
             else if (t.IndexOf(value, StringComparison.CurrentCulture) > 0) 
             { 
              row.Visibility = Visibility.Visible; 
             } 
            } 
           } 
          } 
          reader.Close(); 
         }       
         rows = dataGridView1.Items.Count.ToString();   
         Rows.Content = rows + " Entries"; 
        } 
       } 
      } 
      con.Close(); 
     } 
    } 
+0

WPF unterstützt das 'DataGridView'-Konstrukt nicht. (Auch 'DataGridView' hat keine' Items' Eigenschaft.) Vielleicht meintest du ['DataGrid'] (https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid (v = vs. 110) .aspx)? Wenn ja, bearbeiten Sie Ihre Frage-Tags, damit Ihre Frage mehr Aufmerksamkeit von den richtigen Personen erhält. – OhBeWise

Antwort

0

Du t in dem kombinierten String nur, wenn letzte value von array besteht die Sichtbarkeit der Zeile Visible Einstellung. Auch wird die Zeile nicht sichtbar gesetzt, wenn value am Anfang der Zeichenfolge ist (so dass IndexOf kehrt 0)

foreach (string value in array) 
{ 
    // each time we are here, we are going to overwrite the row.Visibility, 
    // so only the value that was set in the last iteration stays. 
    if (t.IndexOf(value, StringComparison.CurrentCulture) == -1) 
    { 
     row.Visibility = Visibility.Collapsed; 
    } 
    // also > 0 restricts the substring to be found in the beginning of the string 
    // you've probably meant >= 0 or != -1 
    else if (t.IndexOf(value, StringComparison.CurrentCulture) > 0) 
    { 
     row.Visibility = Visibility.Visible; 
    } 
} 

Ich glaube, Sie es sichtbar gesetzt werden soll, wenn mindestens ein Wert eine Teil der ist kombinierte Zeichenfolge t.

row.Visibility = array.Any(value => t.IndexOf(value, StringComparison.CurrentCulture) != -1); 

Das zweite Problem ist, daß die Schleife mit den DataTable Reihen in Betrieb ist, nicht DataGrid Zeilen. Wenn Sie das Raster in der Methode BindGrid aktualisieren, können Sie das Raster nur an die Zeilen binden, die Sie anzeigen möchten.

private void BindGrid(string parameter) 
{ 
    string[] array = parameter.Split(); 
    string constring = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\SearchTable.mdf;Integrated Security=True;Connect Timeout=30"; 
    using (SqlConnection con = new SqlConnection(constring)) 
    { 
     con.Open(); 
     using (SqlCommand cmd = new SqlCommand("SELECT * FROM Projects", con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
      { 
       using (DataTable dt = new DataTable()) 
       { 
        sda.Fill(dt); 
        List<DataRow> rowsToShow = new List<DataRow>(); 
        foreach (DataRow row in dt.Rows) 
        { 
         SqlDataReader reader = cmd.ExecuteReader(); 
         if (reader.HasRows) 
         { 
          while (reader.Read()) 
          { 
           int index = reader.GetInt32(0); 
           string a = reader.GetString(1); 
           string b = reader.GetString(2); 
           string c = reader.GetString(3); 
           string d = reader.GetString(4); 
           string e = reader.GetString(5); 
           string f = reader.GetString(6); 
           string g = reader.GetString(7); 
           string h = reader.GetString(8); 
           string i = reader.GetString(9); 
           string j = reader.GetString(10); 
           string t = a + " " + b + " " + c + " " + d + " " + e + " " + f + " " + g + " " + h + " " + i + " " + j; 

           if (array.Any(value => t.IndexOf(value, StringComparison.CurrentCulture) != -1)) 
           { 
            rowsToShow.Add(row); 
           } 
          } 
         } 
         reader.Close(); 
        } 
        dataGridView1.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = dt }); 
        rows = dataGridView1.Items.Count.ToString(); 
        Rows.Content = rows + " Entries"; 
       } 
      } 
     } 
     con.Close(); 
    } 
} 
+0

Danke filhit, aber ich erhalte einen Fehler auf das Wort 'Sichtbarkeit' - 'System.Data.DataRow' enthält keine Definition für 'Sichtbarkeit' und keine Erweiterungsmethode 'Sichtbarkeit' akzeptiert ein erstes Argument vom Typ 'System. Data.DataRow 'könnte gefunden werden (fehlt eine using-Direktive oder eine Assembly-Referenz? – Dinoduck94

+0

@ Dinoduck94 oh ... Jetzt sehe ich das. Sie iterieren über die Zeilen in den 'DataTable', nicht die' DataGrid' Zeilen. Sie können versuchen, den aktualisierten Code aus meiner Antwort. – filhit

+0

Sehr geschätzt für Ihre Hilfe.Ich verwendete Sie Code oben, aber ich legte die Indizes der erforderlichen Zeilen in einem String-Array und gefiltert die Zeilen mit dem String-Array über 'RowFilter' nochmal – Dinoduck94