实体框架:如何使DataGridView可排序?

时间:2017-01-13 15:28:05

标签: vb.net datagridview visual-studio-2015 entity-framework-6 sql-server-2016

如何在使用Entity Framework从数据库中提取数据时使DataGridView可排序?

我将查询放入DataGridView的DataSource。

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,但这会使网格无法使用。

我在Google上看到的例子已经过时或非常复杂。这感觉就像是应该简单的事情。我将查询转储到DataTable中,但是我回到了列上没有的时间。

那么如何在DGV上放置EF查询并使其可以排序呢?

更新

所以我能够使用Karen的答案让它工作,我做了以下事情;

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?

1 个答案:

答案 0 :(得分:1)

使用SortableBindingList。创建并设置它然后将其分配给BindingSource并将BindingSource分配给DataGridView。抱歉,我在Windows窗体中为EF6做的MSDN代码示例中的唯一示例(并且易于理解)是C#。

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

我的代码示例, https://code.msdn.microsoft.com/Entity-Framework-in-764fa5ba

在第一个链接中下载类,查看Form1中的代码,加载blCustomers设置为实体的事件客户然后将SortableBindingList设置为bsCustomers一个BindingSource,最后bsCustomers成为DataGridView的DataSource。如果你在VB.NET中需要这个,我可以稍后将它们放在一起,目前我的机器上的VS2015正在更新。

更新 在这里,我使用简单的select从我的实体获取数据,并使用类来强类型化数据。 BindingSource是可选的,但我喜欢它提供的功能。注意在Button1中我将BindingSource的Current属性转换为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。