none
Привязка результатов запроса RRS feed

  • Вопрос

  • Здравствуйте, помогите пожалуйста разобраться. Имеется форма следующего вида:

    <Window x:Class="MyApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition Height="30" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TreeView Name="DataTree" ItemsSource="{Binding}" />
            <DataGrid Name="DataTable" AutoGenerateColumns="True" ItemsSource="{Binding}" Grid.Column="1" />
            <Button Content="Button" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="12,7,0,0" Name="MyButton" VerticalAlignment="Top" Width="107" Click="MyButton_Click" />
        </Grid>
    </Window>

    И код который выполняет запрос к базе данных с помощью LinqToEntities:

    private void MyButton_Click(object sender, RoutedEventArgs e)
            {
                MyEntities me = new MyEntities();
                IQueryable<string> result = from c in me.MyTable
                                   select c.Name;
                DataTree.ItemsSource = result;
                DataTable.ItemsSource = result;
            }

    После выполнения в DataTable появляется колонка "Lenght" с указанием длины строки, а нужна колонка "Name" с соответствующими значениями. В DataTree отображаются данные колонки поля "Name".

    Если я выполняю такой запрос:

    var result = from c in me.MyTable
                             select new { Name = c.Name};

    То в DataTable появляется колонка "Name" с соответствующими данными, а в DataTree выводятся строки следующего вида: {Name = Имя1}.

    Кто может объяснить почему так происходит?


Ответы

  • Добрый день.

    1. В перовом варианте запроса, у вас элемент коллекции - строка. Соответственно DataGrid начинает выводить свойства этого класса (в том числе Length).

    2. В случае с новым, анонимным классом, у вас создается объект с одним полем Name. DataGrid выводит свойства этого объекта, т.е. как раз Name.

    3. В дереве, у вас для отображения в ноде вызывается метод ToString вашего анонимного класса. Вот вы и видите его результат.

    P.s. Для первого запроса, я бы переписал DataGrid так:

    <DataGrid Name="DataTable" AutoGenerateColumns="False" ItemsSource="{Binding}" Grid.Column="1">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding}" Header="Имя" />
        </DataGrid.Columns>
    </DataGrid>
    • Помечено в качестве ответа Denis-ProfIT 13 мая 2013 г. 5:42
    Отвечающий

Все ответы

  • Добрый день.

    1. В перовом варианте запроса, у вас элемент коллекции - строка. Соответственно DataGrid начинает выводить свойства этого класса (в том числе Length).

    2. В случае с новым, анонимным классом, у вас создается объект с одним полем Name. DataGrid выводит свойства этого объекта, т.е. как раз Name.

    3. В дереве, у вас для отображения в ноде вызывается метод ToString вашего анонимного класса. Вот вы и видите его результат.

    P.s. Для первого запроса, я бы переписал DataGrid так:

    <DataGrid Name="DataTable" AutoGenerateColumns="False" ItemsSource="{Binding}" Grid.Column="1">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding}" Header="Имя" />
        </DataGrid.Columns>
    </DataGrid>
    • Помечено в качестве ответа Denis-ProfIT 13 мая 2013 г. 5:42
    Отвечающий
  • Спасибо за разъяснения, а то ни где не смог найти почему так происходит.