如何在使用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?
答案 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。