1

Как сделать DataGridView сортировкой при использовании Entity Framework для извлечения данных из базы данных?Entity Framework: как сделать DataGridView Sortable?

Я помещаю запрос в DataSource DataGridView.

Dim Query = (From t In DB.interview_task Where t.CONTROL = CONTROL And t.CLIENTCODE = CLIENTCODE Order By t.StartDate Descending 
      Select t.ID, t.CONTROL, t.CLIENTCODE, t.TaskType, t.Title, t.StartDate, t.DueUserName, Status = If(t.CompleteDate Is Nothing, "In Progress", "Completed")).ToList 

dgvTaskList.DataSource = Query 

Единственный способ загрузки данных в DGV является превращение его в .list, но это делает сетку unsortable.

Примеры, которые я вижу в Google, устарели или действительно сложны. Это похоже на то, что должно быть простым. Я сбрасывал запрос в DataTable, но возвращаю Time, который не находится в столбце.

Итак, как мне поместить запрос EF на DGV и сделать его сортировкой?

Update:

Так что я был в состоянии получить его на работу, используя ответ Карен, я сделал следующее;

Public Sub Load_TaskList() 
    Using DB As New wotcDB 
     Dim Query2 = From t In DB.interview_task Where t.CONTROL = CONTROL And t.CLIENTCODE = CLIENTCODE Order By t.StartDate Descending 
        Select New TaskList With {.ID = t.ID, 
         .CONTROL = t.CONTROL, 
         .CLIENTCODE = t.CLIENTCODE, 
         .TaskType = t.TaskType, 
         .Title = t.Title, 
         .StartDate = t.StartDate, 
         .Status = If(t.CompleteDate Is Nothing, "In Progress", "Completed")} 
     dgvTaskList.DataSource = New WOTC_Common.SortableBindingList(Of TaskList)(Query2.ToList) 
    End Using 
    dgvTaskList.Columns("id").Visible = False 
    dgvTaskList.Columns("CONTROL").Visible = False 
    dgvTaskList.Columns("CLIENTCODE").Visible = False 
End Sub 

Class TaskList 
    Public Property ID As Integer 
    Public Property CONTROL As Integer 
    Public Property CLIENTCODE As String 
    Public Property TaskType As String 
    Public Property Title As String 
    Public Property StartDate As Date? 
    Public Property DueUserName As String 
    Public Property Status As String 
End Class 

Так что для другого вопроса. Можно ли использовать этот метод сортировки без объявления TaskList?

+0

Вызов 'Sort (...)'? Просто глядя на документацию для DataGridView, я вижу «ColumnHeaderMouseClickEvent». Почему бы не послушать его и назвать 'Sort' для этого столбца? Это кажется самым простым. https://msdn.microsoft.com/en-us/library/0868ft3z(v=vs.110).aspx – TyCobb

+0

Что касается использования TaskList, нет, то SortableBindingList нуждается в сильном типе. –

+0

Bummer, во всяком случае, ваш ответ сработал. Отмечено как ответ. Спасибо. – Kayot

ответ

1

Использование SortableBindingList. Создайте и настройте его, затем назначьте его BindingSource и назначьте BindingSource в DataGridView. Извините, мой единственный пример (и легко следовать) находится в C# в образце кода MSDN, который я сделал для EF6 в формах Windows.

SortableBindingList https://code.msdn.microsoft.com/windowsdesktop/Generic-sortable-binding-47cac3cc

Мой пример кода, https://code.msdn.microsoft.com/Entity-Framework-in-764fa5ba

Скачать класс в первой ссылке, посмотрите на код в Form1, события нагрузки, где blCustomers устанавливается на сущностей клиентов, то SortableBindingList устанавливается в bsCustomers a BindingSource и, наконец, bsCustomers становится DataSource для DataGridView. Если вам это нужно в VB.NET, я могу собрать его позже, в настоящее время VS2015 на моей машине обновляется.

Обновление Здесь я получаю данные от своего объекта, используя простой выбор и использую класс для сильного типа данных. BindingSource является необязательным, но мне нравится его функциональность. Примечание в Button1 я передал текущее свойство BindingSource в DemoClass и получил два свойства.

Public Class Form1 
    Private bsCustomers As New BindingSource 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     Using entity As New DemoEntities 
      Dim results = entity _ 
       .Customers _ 
       .Select(Function(items) New DemoClass With 
       { 
        .Id = items.id, 
        .LastName = items.LastName 
       } 
      ).ToList 
      bsCustomers.DataSource = New SortableBindingList(Of DemoClass)(results) 
      DataGridView1.DataSource = bsCustomers 

     End Using 
    End Sub 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim LastName As String = CType(bsCustomers.Current, DemoClass).LastName 
     Dim Identifier As Integer = CType(bsCustomers.Current, DemoClass).Id 
     MessageBox.Show($"id: {Identifier} Lastname: {LastName}") 
    End Sub 
End Class 
Class DemoClass 
    Public Property Id As Integer 
    Public Property LastName As String 
End Class 

Примечание. Синтаксис для содержимого MessageBox - VS2015, для более низкой версии используется String.Format.

+0

Я импортировал это в свой код. Как использовать анонимные типы для этого Сортируемого списка привязок? Я никогда раньше не использовал T, и я не знаю, как это работает. – Kayot

+0

См. Мой обновленный ответ, где я только что создал образец, который я сохранил просто для ясности. Класс, используемый для сортировки, - это тот, который я упомянул в своем ответе. –