0

我有一个Windows窗体的按钮和datagridview。该项目包括一个工作数据库连接和LINQ to SQL类。我试图将datagridview绑定到LINQ to SQL。LINQ to SQL datagridview查询返回的长度,而不是值

代码模块中我有这样的:

Public Function DataGridList() As BindingSource 
    Dim NewBindingSource As New BindingSource() 
    Dim db As New DataClasses1DataContext() 
    NewBindingSource.DataSource = _ 
    From Block In db.BLOCK_ASSIGNMENTs 
     Where Block.gr912_school = "Franklin" 
    Select Block.gr6_school Distinct 
    Return NewBindingSource 
End Function 

而在此形式的代码button_click:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    DataGridView1.DataSource = DataGridList() 
End Sub 

当我按一下按钮,我得到了学校名称的长度datagridview,列标题为“length”。

results

如果我只是运行在button_click此非常类似的代码,而不是,学校名称正确地显示在即时窗口:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim db As New DataClasses1DataContext() 
    Dim TestQuery = 
    From Block In db.BLOCK_ASSIGNMENTs 
     Where Block.gr912_school = "Franklin" 
    Select Block.gr6_school Distinct 
    For Each block In TestQuery 
     Debug.Print(block) 
    Next 

End Sub 

回答

1

给这是一个尝试:

Public Function DataGridList() As BindingSource 
    Dim NewBindingSource As New BindingSource() 
    Dim db As New DataClasses1DataContext() 
    NewBindingSource.DataSource = _ 
    From Block In db.BLOCK_ASSIGNMENTs 
     Where Block.gr912_school = "Franklin" 
    Select New With { Key .Value = Block.gr6_school } Distinct 
    Return NewBindingSource 
End Function 

这应该给它一个DataGridView可以接受的属性。 New With ...使用名为Value的Property创建一个匿名对象。 DataGridView通过枚举公共属性并将它们呈现为列来处理这种类型的对象。如果您需要多个值,则可以使用逗号分隔的方式在花括号内添加其他项目。有关更多信息,请参阅Anonymous Types (Visual Basic)

+0

是的!谢谢。这工作比我的解决方案更快,也适用于我尝试使用“Contains”在SQL中复制“IN”子句。我曾看过“New With”构建,但不能一起破解任何东西。你可以谈谈它在做什么吗? – 2012-08-02 18:11:45

+0

当然可以。我为你添加了一些解释。 – JamieSee 2012-08-03 15:41:06

+0

感谢您的解释。实际上我确实需要更多的专栏,我担心这会很棘手。但是,正如你所说,我只是在其中添加了其他五个领域,而且效果很好。我喜欢这个LINQ to SQL的东西,但似乎有很多方法来完成任何给定的任务。谢谢你向我展示了一个很好的! – 2012-08-03 16:11:11

0

您可以尝试添加的ToString的选择:

From Block In db.BLOCK_ASSIGNMENTs 
     Where Block.gr912_school = "Franklin" 
    Select Block.gr6_school.ToString Distinct 

我相信当打印到直接窗口时,Debug.Print会对.ToString进行隐式转换。但是,datagrid单元格将所有内容视为对象并显示该对象的默认属性。

+0

感谢您的想法。这将不会编译 - 它错误为“范围变量名称不能匹配'对象'类的成员的名称”。我在其他地方尝试了投射和ToStringing,但得到一个空的datagridview。我添加了一个ListBox并以相同的方式设置它的DataSource,并且它填充正确。当我设置一个断点并检查DataGridView1.DataSource的列表时,它会显示正确的成员 - 8个带校名的漂亮字符串。 – 2012-08-02 16:08:39

+0

@DougGlancy,对于heck,试试'CStr()'而不是'.ToString' – 2012-08-02 16:18:54

+0

我确实尝试过(我的意思是“cast and ToStringing”:))。我找到了一个解释和解决方案,我想:http://www.psworld.pl/Programming/BindingListOfString。只需要弄清楚如何将提要LINQ SQL查询转换为DataTable,DataTable可以成为DataGridView的源代码。 – 2012-08-02 16:38:23

0

原来,这已经被经常处理,其中包括on SOhere。我选择的路线是使用一个中间数据表:

Public Function DataGridList() As DataTable 
    Dim NewDataTable As New DataTable 
    Dim db As New DataClasses1DataContext() 
    Dim i As Int32 

    Dim qry = 
    From Block In db.BLOCK_ASSIGNMENTs.AsEnumerable 
     Where Block.gr912_school = "Franklin" 
    Select Block.gr6_school Distinct 

    NewDataTable.Columns.Add("School") 
    For i = 0 To qry.Count - 1 
     NewDataTable.Rows.Add(qry(i)) 
    Next 
    Return NewDataTable 
End Function 

这似乎相当缓慢运行的第一次,所以我会在将来尝试别的东西,但它可以让我通过LINQ,饲料电网哪些是我想与之合作的。

(我想用QRY的CopyToDataTable财产,但如果查询返回DataTableRows收集,或一些这样的,我的黑客周围没有透露该怎么做才能使用它。)