简体   繁体   中英

Sort datagridview by created columns. Entity Framework c# Winforms

I´m having a problem, I retrieve all the Loans I have stored in my database like this:

list_loans = db.Loan.Where(x => x.State.id_state != 6).ToList();

db is the Object context.

Then, I assign that list as the DataSource for my DataGridView.

dgv_Loans.Datasource = list_loans;

With that info, I add some columns. Like for example, installments left to pay. I get that value by counting the result of a query.

The user can order the result using some options. Is easy to order the result from the fields that the entity have (using linq), but I dont know how to order the results using this new columns.

I read some posts here and tried this:

dgv_Loans.Sort(dgv_Loans.Columns["installments_left"], ListSortDirection.Ascending);

By doing this, I´m getting the following exception at runtime:

"DataGridView control must be bound to an IBindingList object to be sorted."

Is there anyway to use linq to orderby created columns in a DataGridViewColumn? Or how can I solve this error?

I know there are related posts, but after reading them, I can´t find a solution to this specific problem. Thats why I showed how I implemented to get some advice..

Rather than binding directly to the list retrieved from database, what I generally do is have a view class and have all the calculated properties in that class

public class LoanView : Loan {
  public LoanView(Loan loan){
  }
  public int InsallmentsLeft { get { return ...; } }
}

and then bind the datasource to a list of this, this keeps sorting working.

Concerning about Sort datagridview by created columns using Entity Framework

I guess you need this Presenting the SortableBindingList<T>

Usage:

loanBindingSource.DataSource = new SortableBindingList<Loan>(list_loans.ToList());
dgv_Loans.Datasource = loanBindingSource; 
int ID = Convert.ToInt32(cmbDepartments.SelectedValue);
var EmployeeList = from Employee in db.Employee
    where Employee.DepartmentID == ID
    select new
    {
        Employee.FirstName,
        Employee.LastName
    };
dataGridView1.DataSource = EmployeeList.ToList();

You could directly give the data source to dataGridView1.DataSource but you must write ToList() at the end of your query:

int ID = Convert.ToInt32(cmbDepartmanlar.SelectedValue);

dataGridView1.DataSource = (from Employee in db.Employee
                            where Employee.DepartmentID == ID
                   select new
                   {
                       Employee.FirstName,
                       Employee.LastName
                   }).ToList();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM