2016-04-22 8 views
0

Я программирую на C#. Программа представляет собой строки для учащегося, связанного с ним. У меня есть список имен учеников, и я собираюсь использовать только одного студента iD и напечатать все его оценки в представлении сетки данных. Я не могу этого сделать, и это просто показывает мне все студентские оценки. Все, что мне нужно, это печатать только классы учеников.Невозможно удалить строки из DataGridView

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(); 
      } 

     } 

    } 

ответ

1

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

// 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

Вам не нужно удалять элементы из сетки или списка. В таких случаях вы можете использовать фильтрацию. Вы можете фильтровать список входных данных с помощью linq и задавать результат фильтрации как DataSource от DataGridView:

var filteredBindingList = new BindingList<StudentGrade>(
          _studentGrade.Where(x => x.StudentID == studentID).ToList()); 
dgvGrades.DataSource = filteredBindingList; 
Смежные вопросы