2016-04-22 2 views
0

Ich programmiere in C#. Das Programm ist über Zeilen für einen Studenten verbunden. Ich habe eine Liste mit Schülernamen, und ich werde nur einen Studenten-ID verwenden und alle seine Noten in der Datenrasteransicht drucken. Ich kann das nicht und es zeigt mir nur alle Noten. Alles, was ich brauche, druckt nur die Noten eines Schülers.Löschen von Zeilen aus DataGridView nicht möglich

private BindingList<StudentGrade> _studentGrade = new BindingList<StudentGrade>(); 

    public frmGrades(int studentID) 
    { 
     InitializeComponent(); 
     loadItemsFromFiles(); 

     dgvGrades.DataSource = _studentGrade; 

     string id = studentID.ToString(); 

     for (int z = 0; z < dgvGrades.Rows.Count;z++) 
     { 
      if (!dgvGrades.Rows[z].Cells["StudentID"].Value.ToString().Equals(id)) 
      { 
       dgvGrades.Rows.RemoveAt(z); 
       z--; 
       dgvGrades.Refresh(); 
      } 

     } 

    } 

Antwort

1

Es ist nicht erlaubt, die Sammlung während der Iteration zu ändern; was Sie tun können, ist die Zeilen aus der Bindungsquelle löschen und binden wieder. dh

// collecting rows that satisfies the condition 
var query = _studentGrade.AsEnumerable().Where(row => row.Field<string>("StudentID") == id); 

//deleting collected rows from the source 
foreach(var row in query.ToList()) 
    row.Delete(); 

// re assign the datasource 
dgvGrades.DataSource = _studentGrade; 
dgvGrades.Refresh(); 
1

Sie müssen keine Elemente aus Raster oder Liste zu entfernen. In solchen Fällen können Sie filtern. Sie können die Eingabeliste unter Verwendung von linq filtern und das gefilterte Ergebnis als DataSource von DataGridView:

var filteredBindingList = new BindingList<StudentGrade>(
          _studentGrade.Where(x => x.StudentID == studentID).ToList()); 
dgvGrades.DataSource = filteredBindingList; 
festlegen