views:

29

answers:

2

I have a Datatable with many columns, and a datagrid in which I need to display only a few of those columns. I need a codesample of how to do it. I found a whole bunch of examples telling me to turn AutoGenerateColumns to true and set the table as DataContext to display all the columns in my DataTable. And I guess I could then put in a page of code to hide all the columns that I don't need, rearrange the leftover ones to proper order and size, but surely there must be a more elegant way.

In designer I have build the collection of columns I want to display, I got the datable, how do I bind an existing datagrid column to a specific datatable column in my code?

+1  A: 

Bind your DataTable to the DataGrid, set the AutoGenerateColumns to False, and then add whatever columns you want to DataGrid.Columns. Here's an example using a DataTable called Collection, with two columns: ID and Value.

<DataGrid
    ItemsSource="{Binding Path=Collection}"
    AutoGenerateColumns=False
    >

    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" />
        <DataGridTextColumn Header="Value" Binding="{Binding Path=Value}" />
    </DataGrid.Columns>
</DataGrid>
Rachel
zzzzzzzzzzzzzzz
Andrey
@andrey way to thank people for trying to help you.
Will
the 'zzz' post was accidental, not to imitate sleeping or boredom. I was trying to clarify what I did below, in response to Rachel's example but did not realise that it would appear as a comment and not an answer. When I deleted text out of the comment and copied it to try to answer I must have stumbled on the z key. No offence ment to Rachel as her post did help me to figure out how to do what I wanted in code
Andrey
A: 

XAML binding would not work for me because my datatable is generated at runtime so there is nothing to bind to at design time. Anyway, i stumbled on how to do what I wanted here. My problems were because for some reason there was no error thrown when I would set ItemSource to the table itself instead of the table's DefaultView, even though, as I later read the table does not implement the required interface. But without any errors to tell me different I had nothing to go on to find why my grid would display as empty.

DataGridName.DataContext = DataSetName.DataTableName; DataGridName.ItemsSource = DataSetName.DataTableName.DefaultView;

((DataGridTextColumn)DataGridName.Columns[1]).Binding = new Binding("DataTableColumnName1"); ((DataGridTextColumn)DataGridName.Columns[0]).Binding = new Binding("DataTableColumnName2"); ((DataGridTextColumn)DataGridName.Columns[2]).Binding = new Binding("DataTableColumnName3");

Andrey