开发者

Databinding LINQ query results (with join tables) to DataGrid

开发者 https://www.devze.com 2023-02-11 03:53 出处:网络
In my WPF 4 desktop-based application, I have an LINQ query that makes a join with two tables. Here is code for function that returns results of LINQ query:

In my WPF 4 desktop-based application, I have an LINQ query that makes a join with two tables.

Here is code for function that returns results of LINQ query:

public IList GetTableData()
{
    IList dataList = (from dWorker in App.glidusContext.tbl_workers
        join d2 in App.glidusContext.tbl_workers_has_tbl_events
        on dWorker.workerID equals d2.workerID
        where dWorker.workerTZ == strSplit
        select new { dWorker, d2 }).ToList();
    return data list;
}

Now, all what I rest to do is data bind results of this LINQ query to DataGrid:

private IList currentData; //class property

public void AssignTableContentToDataContext() {
    currentData = GetTableData();
    this.ContentDataGrid.DataContext = currentData;
}

And here is an XAML-code of DataGrid:

<DataGrid x:Name="ContentDataGrid"
          Style="{StaticResource Body_Content_DataGrid}"
          CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
          ItemsSource="{Binding}"
          KeyboardNavigation.TabIndex="8"
          SelectionChanged="ContentDataGrid_SelectionChanged" DataContext="{Binding}">
    <!--  PreviewKeyDown="DBRecord_Delete_PreviewKeyDown" -->
    <!--  CellEditEnding="ContentDataGrid_CellEditEnding" -->
    <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerID}"
                            Width="130"
                            IsReadOnly="True"
                            Binding="{Binding Path=workerID}" />
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_workerTZ}"
                            Width="130"
                            Binding="{Binding Path=workerTZ}" />
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerFirstName}"
                            Width="130"
                            Binding="{Binding Path=workerFirstName}" />
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerLastName}"
                            Width="130"
                            Binding="{Binding Path=workerLastName}" />
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EventID}"
                            Width="130"
         开发者_开发百科                   Binding="{Binding Path=eventID}" />
        <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EventName}"
                            Width="*"
                            Binding="{Binding Path=eventName}" />
    </DataGrid.Columns>
</DataGrid>

After debug I got the following results:

  1. My query returns rows with results
  2. My DataGrid shows lines, according to number of lines in the query result, but they are blank!

How can I data bind this data and show them in DataGrid?

P.S. In case of more simple query such as select * from _table_ everything works fine and DataGrid shows data, but when I use more complex queries with more than one table (make join) I can't databind it correctly.


LINQ-join works different from SQL-join. It doesn't merge different sources in one plain source. So change each binding in the DataGrid like in this example:

{Binding Path=workerID}

for

{Binding Path=dWorker.workerID}

Or d2.workerID, I don't know the properties of these classes, but the mistake is in the bindings.

And don't forget to set IsReadOnly="True" in the DataGrid, because otherwise it will raise an exception if to start editing.


You dont have to use entity alias in your binding clause. Just put the column name on the Binding clause

<DataGridTextColumn Width="200" Header="CPF" IsReadOnly="True" Binding="{Binding Path=NumeroDoc}">

Remove .ToList() from your code, returning a IEnumerable object

public static IEnumerable getQueryTable()
    {
        var dataList = (from c in App.DbContext.Cliente
                 join d in App.DbContext.DadosDocumento
                 on c.IDCliente equals d.IDCliente
                 select new { c.IDCliente, c.Nome, c.DataCadastro, d.NumeroDoc });
        return dataList;
    }

And fill the datagrid using ItemsSource property:

dgDados.ItemsSource = DBHelper.getQueryTable();

It works fine for me.

0

精彩评论

暂无评论...
验证码 换一张
取 消