【问题标题】:How do I bind specific columns to a DataGrid using Entity Framework 6?如何使用 Entity Framework 6 将特定列绑定到 DataGrid?
【发布时间】:2023-03-14 04:35:01
【问题描述】:

我有一个大约 20 列的 SQL 表。我想从中提取 3 列并在我的前端 WPF 应用程序中填充一个数据网格。到目前为止,这是我的代码。

 Private Sub AccountSelectorDialogue_load(ByVal sender As Object, ByVal e 
 As EventArgs) Handles MyBase.Loaded

    Try
        Dim context As MyDatabase = New MyDatabase

        Dim qry_Accounts = From accounts In context.tbl_Accounts
                           Order By accounts.AccName
                           Select {accounts.AccName, accounts.AccPhone, accounts.ParentAcc}
        Dim results = qry_Accounts.ToList()

        AccountDataGrid.DataContext = results

    Catch ex As Exception
        MessageBox.Show("Error while selecting record from table..." & ex.Message, "Select Records")
        MessageBox.Show(ex.InnerException.Message)
    End Try

End Sub

当我加载数据网格时,我得到this 异常和this 内部异常。我觉得我错过了一些基本的东西,但我没有看到它。

编辑:当我像这样编写Select 行并删除results 变量时,异常消失了。

 Select {accounts.AccName, accounts.AccPhone,      accounts.ParentAcc}.ToList()
 AccountDataGrid.DataContext = qry_Accounts

但是,数据网格仍然没有显示任何内容。

编辑 2:使用 ItemsSource 而不是 DataContext。现在数据网格显示了正确的行数 - 但它们是空的......

编辑 3:盯着我的屏幕几个小时后,我认为这可能是我的 xaml。最初我认为我不必绑定我的列。如果我确实需要,我不知道如何在这种情况下。

<DataGrid x:Name="AccountDataGrid" ItemsSource="{Binding}"      
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="480" 
MinHeight="200"  VerticalScrollBarVisibility="Auto" 
HorizontalScrollBarVisibility="Auto" AutoGenerateColumns="False" 
Background="Transparent" >
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="AccountName" Binding="
{Binding AccName}" Header="Account Name" Width="Auto" MinWidth="180"/>
                    <DataGridTextColumn x:Name="PhoneNumber" Binding="
{Binding AccPhone}" Header="Phone" Width="Auto" MinWidth="150"/>
                    <DataGridTextColumn x:Name="AccountOwnerAlias" 
 Binding="{Binding ParentAcc}" Header="Account Owner Alias" Width="Auto" 
 MinWidth="150"/>
                </DataGrid.Columns>
            </DataGrid>

【问题讨论】:

  • {accounts.AccName, accounts.AccPhone, accounts.ParentAcc} 的类型是什么。我猜 ParentAcc 是一个导航属性,而不是一个标量值。
  • 都是字符串(数据库中的nchar)
  • 这一行对我来说看起来很奇怪~Dim context As MyDatabase = New MyDatabase~ 我们可以看到你的 DBContext 的代码吗?你是如何发送连接字符串的?
  • MyDatabase 是我使用实体框架自动创建的数据访问类的名称。我怀疑那里有问题 - 我还有许多其他查询工作正常......

标签: wpf vb.net entity-framework linq datagrid


【解决方案1】:

由于你只能绑定到公共属性,你需要定义你的匿名类型的属性:

Select New With { .AccName = accounts.AccName, .AccPhone = accounts.AccPhone, .ParentAcc = accounts.ParentAcc }.ToList()
AccountDataGrid.DataContext = qry_Accounts

如果您希望能够编辑记录,您应该定义一个具有三个属性(AccName、AccPhone 和ParentAcc)的类(YourClass)并将DataContext 设置为@ 987654327@:

Select New YourClass With { .AccName = accounts.AccName, .AccPhone = accounts.AccPhone, .ParentAcc = accounts.ParentAcc }.ToList()

【讨论】:

  • 谢谢先生!你结束了很多挫折。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 2012-03-09
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多