none
Привязка данных типа Главный->Подробности. DataRelation RRS feed

  • Вопрос

  • Не могу выполнить привязку:

    Есть DataSet, который состоит из 2-х таблиц:
    Category (CategoryID, CategoryName)
    Products(ProductID, CategoryID, Name).

    Эти таблицы связаны через DataRelation по ключу CategoryID. (т.е есть категории товаров и товары кот. к ним относятся).

    Есть TreeView, которая привязана к DataSet.Tables["Category"] - все ОК, имена категорий отображаются корректно.
    И есть ListView в котором необходимо отобразить таблицу "Products" с записями, относящимися к категории, выбранной в элементе TreeView.

    Подскажите пожалуйста как сделать привязку для ListView в данном случае?

    Спасибо!
    • Изменено sergey.csc 31 августа 2011 г. 13:21
    31 августа 2011 г. 12:36

Ответы

  • пример для WPF; привязка: ListView1 <- ListView2 и TreeView1 <- ListView3

    [XAML]

    <Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="810" FontSize="15">
      <Window.Resources>
        <DataTemplate x:Key="DetailTemplate">
          <TextBlock Text="{Binding name}" />
        </DataTemplate>
        <HierarchicalDataTemplate x:Key="MasterTemplate" 
                     ItemTemplate="{StaticResource DetailTemplate}" 
                     ItemsSource="{Binding element_item}">
          <TextBlock Text="{Binding name}" />
        </HierarchicalDataTemplate>
      </Window.Resources>
      <StackPanel Orientation="Horizontal">
        <ListView x:Name="Master" Width="200" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource MasterTemplate}" />
        <ListView x:Name="Details" Width="200" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource DetailTemplate}" />
        <TreeView x:Name="Tree" Width="200" ItemsSource="{Binding element}" ItemTemplate="{StaticResource MasterTemplate}" />
        <ListView x:Name="TreeDetails" Width="200" 
             ItemsSource="{Binding ElementName=Tree, Path=SelectedValue.element_item}">
          <ListView.ItemTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding name}" />
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
      </StackPanel>
    </Window>
    
    

    [C#]

    using System.Data;
    using System.IO;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace WpfApplication11
    {
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
    
          DataSet ds = new DataSet();
          ds.ReadXml(new StringReader(@"
              <data>
                <element name='element 1'>
                  <item name='1.1' />
                  <item name='1.2' />
                </element>
                <element name='element 2'>
                  <item name='2.1' />
                  <item name='2.2' />
                  <item name='2.3' />
                </element>
              </data>"));
          this.DataContext = ds;
          var et = ds.Tables["element"];
          this.Master.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source = et });
          this.Details.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source = et, Path = new PropertyPath("element_item") });
        }
      }
    }
    

    • Предложено в качестве ответа Malobukv 31 августа 2011 г. 22:31
    • Помечено в качестве ответа Abolmasov Dmitry 5 сентября 2011 г. 6:34
    31 августа 2011 г. 22:28

Все ответы

  • > таблицы связаны через DataRelation ... как сделать привязку для DataGridView

    для .DataMember указать имя_таблицы.имя_отношения
    пример http://www.gotdotnet.ru/forums/1/81054/385651/#post385651

    31 августа 2011 г. 12:54
  • Прошу прощения, в вопросе допустил ошибку. Интересует как отобразить данные в ListView конечно же :)

    Я использую WPF. DataMember - это из WindowsForms ?

    31 августа 2011 г. 13:21
  • > ... это из WindowsForms ?

    DataGridView (был указан в первом сообщении) - он из WinForms

    > Интересует как отобразить данные в ListView ... Я использую WPF

    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/9704e0bc-f7e7-4eeb-9ec7-76a9e628f01d

     

    31 августа 2011 г. 13:34
  • Я сделал по аналогии с вашим примером. Но у меня получается так: при выборе элемента TreeView, данные в дочернем ListView не обновляются как я расчитывал, вместо этого в ListView постоянно отображается список Products для первой категории.

    Уже неделю пытаюсь разобраться в чем проблема.. пока не получается. Может вы поможете.

     

    Вот код окна:

     

    public DataSet GetDataSet()
     {
     string queryCatStr = @"SELECT * FROM [Category]";
     string queryProdStr = @"SELECT * FROM [Products]";
    
     DataSet ds = new DataSet();
    
     SQLConnection dbConn = new SQLConnection("conn_str"))
     dbConn.Open(); 
     SQLCommand cmd = new SQLCommand(dbConn);
    
     cmd.CommandText = queryCatStr;
     SQLDataAdapter da = new SQLDataAdapter(cmd);
     da.Fill(ds, "Categories");
    
     cmd.CommandText = queryProdStr;
     da.Fill(ds, "Products");
    
     DataRelation drCat2Prod = new DataRelation("Cat2Prod", ds.Tables["categories"].Columns["CategoryID"], ds.Tables["Products"].Columns["CategoryID"]);
     ds.Relations.Add(drCat2Prod);
     
     return ds;
     }
    
     private void Window_Loaded(object sender, RoutedEventArgs e)
     {
     ds = GetDataSet();
     this.DataContext = ds.Tables["Category"];
     this.treeCategories.DisplayMemberPath = "CategoryName";
     }

    Вот код привязки:

     

     <TreeView Grid.Row="1" x:Name="treeCategories" ItemsSource="{Binding}">
     </TreeView>
    
    ...
    <ListView x:Name="lstProducts" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Cat2Prod}">
    


    31 августа 2011 г. 14:16
  • пример для WPF; привязка: ListView1 <- ListView2 и TreeView1 <- ListView3

    [XAML]

    <Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="810" FontSize="15">
      <Window.Resources>
        <DataTemplate x:Key="DetailTemplate">
          <TextBlock Text="{Binding name}" />
        </DataTemplate>
        <HierarchicalDataTemplate x:Key="MasterTemplate" 
                     ItemTemplate="{StaticResource DetailTemplate}" 
                     ItemsSource="{Binding element_item}">
          <TextBlock Text="{Binding name}" />
        </HierarchicalDataTemplate>
      </Window.Resources>
      <StackPanel Orientation="Horizontal">
        <ListView x:Name="Master" Width="200" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource MasterTemplate}" />
        <ListView x:Name="Details" Width="200" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource DetailTemplate}" />
        <TreeView x:Name="Tree" Width="200" ItemsSource="{Binding element}" ItemTemplate="{StaticResource MasterTemplate}" />
        <ListView x:Name="TreeDetails" Width="200" 
             ItemsSource="{Binding ElementName=Tree, Path=SelectedValue.element_item}">
          <ListView.ItemTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding name}" />
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
      </StackPanel>
    </Window>
    
    

    [C#]

    using System.Data;
    using System.IO;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace WpfApplication11
    {
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
    
          DataSet ds = new DataSet();
          ds.ReadXml(new StringReader(@"
              <data>
                <element name='element 1'>
                  <item name='1.1' />
                  <item name='1.2' />
                </element>
                <element name='element 2'>
                  <item name='2.1' />
                  <item name='2.2' />
                  <item name='2.3' />
                </element>
              </data>"));
          this.DataContext = ds;
          var et = ds.Tables["element"];
          this.Master.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source = et });
          this.Details.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source = et, Path = new PropertyPath("element_item") });
        }
      }
    }
    

    • Предложено в качестве ответа Malobukv 31 августа 2011 г. 22:31
    • Помечено в качестве ответа Abolmasov Dmitry 5 сентября 2011 г. 6:34
    31 августа 2011 г. 22:28
  • Уважаемый пользователь, пожалуйста, не забудьте отметить ответ или ответы, которые рашают проблему. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'. Спасибо.
    Для связи [mail]
    1 сентября 2011 г. 15:26