Как запросить 2 коллекции в 2 набора данных с драйвером mongodb и связыванием - PullRequest
0 голосов
/ 11 ноября 2019

Я создал приложение для повторного заказа. В качестве хранилища я использую сервер MongoDB. Я хочу выполнять операции CRUD, нажимая кнопки на моем главном экране. Операция создания уже работает без сбоев. Теперь я пытаюсь выполнить операцию READ (QUERY).

Моя коллекция MongoDB

reorders

имеет следующую структуру:

enter image description here

Самая важная часть здесь - это "artikelliste" ключ, потому что он наследует все пары значений ключа моей второй коллекции

артикулы

, как вы можете видеть в следующей структуре (обратите внимание, что идентификаторы объекта являются единственной точкой соединения!):

enter image description here

Я создал 2 таких сетки данных:

enter image description here

Первая сетка данных должна содержать значения моей коллекции REORDERS безмассив artikelliste . Вторая сетка данных должна содержать значения моей коллекции ARTICLES, но только те, которые относятся к соответствующему переупорядочению ...

Это означает, что, если я щелкну в первой строке сетки данных REORDERS, я хочу, чтобы показалась вторая сетка данныхтолько статьи, которые связаны с этим переупорядочением - через соединение идентификатора объекта (потому что идентификатор объекта - единственное значение, которое связывает эти 2 коллекции!).

То, что я до сих пор делал ... XAML

<Window x:Class="Nachbestellungen.vorhandeneNachbestellungen"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Nachbestellungen"
    mc:Ignorable="d"
    WindowStartupLocation="CenterScreen"
    Title="Vorhandene Nachbestellungen" WindowState="Maximized" WindowStyle="ThreeDBorderWindow">

<Window.Resources>
    <Style x:Key="cellLightGray" TargetType="{x:Type TextBlock}">
        <Setter Property="Background" Value="LightGray" />
    </Style>
</Window.Resources>
<!-- View -->
<Grid x:Name="gridVorh">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Vertical">
        <DataGrid x:Name="dgVorh" ItemsSource="{Binding CollTop}" SelectedItem="{Binding SelItem}"
                  Margin="5" Grid.Row="0"
              SelectionMode="Single" SelectionUnit="FullRow" IsReadOnly="False" 
              CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" 
              BorderBrush="Black" BorderThickness="2" RowHeight="30" FontFamily="Arial Narrow" FontSize="18">

        <!-- Style Column Headers -->
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Foreground" Value="#FFFFFF"/>
                <Setter Property="Background" Value="#DD002C"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="BorderThickness" Value="0,0,1,2"/>
                <Setter Property="BorderBrush" Value="Black"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="Height" Value="30"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn Header="Angelegt am" Binding="{Binding Angelegt_am}" IsReadOnly="True">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="TextBlock.Background" Value="LightGray"/>
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Bearbeiter" Binding="{Binding Bearbeiter}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bestelldatum" Binding="{Binding Bestelldatum}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bestellt bei" Binding="{Binding Empfaenger}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferung zu" Binding="{Binding Anlieferungsort}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Liefername" Binding="{Binding Adressat}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferanschrift" Binding="{Binding Anschrift}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferort" Binding="{Binding Plz_Ort}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Liefertermin" Binding="{Binding Liefertermin}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
        </DataGrid.Columns>
    </DataGrid>

    <!-- ARTIKEL ZUR NACHBESTELLUNG -->
    <DataGrid x:Name="dgVorhArtikel" ItemsSource="{Binding SelItem.artikelliste}" 
              Margin="5" Grid.Row="0"
              SelectionMode="Single" SelectionUnit="Cell" IsReadOnly="False" 
              CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" 
              BorderBrush="Black" BorderThickness="2" RowHeight="30" FontFamily="Arial Narrow" FontSize="18">

        <!-- Style Column Headers -->
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Foreground" Value="#FFFFFF"/>
                <Setter Property="Background" Value="#DD002C"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="BorderThickness" Value="0,0,1,2"/>
                <Setter Property="BorderBrush" Value="Black"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="Height" Value="30"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn Header="Pos" Binding="{Binding Pos}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Artikelbezeichnung" Binding="{Binding Artikelbezeichnung}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Artikelnummer" Binding="{Binding Artikelnummer}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Einheit" Binding="{Binding Einheit}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Menge" Binding="{Binding Menge}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Einzelpreis" Binding="{Binding Einzelpreis}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Gesamtpreis" Binding="{Binding Gesamtpreis}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderungsgrund" Binding="{Binding Anforderungsgrund}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderungsnr" Binding="{Binding Anforderungsnr}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderer" Binding="{Binding Anforderer}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Rechnungsnr" Binding="{Binding Rechnungsnr}"/>
            <DataGridTextColumn Header="AB-Nr" Binding="{Binding ABnr}"/>
            <DataGridTextColumn Header="ÄndDatum" Binding="{Binding LetzteAktualisierung}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bemerkungen" Binding="{Binding Bemerkungen}"/>
        </DataGrid.Columns>
    </DataGrid>
    </StackPanel>

    <StackPanel Name="stpnlUpdate" Grid.Row="1" HorizontalAlignment="Center">
        <Button Name="btnUpdate" Content="Aktualisieren" 
                Background="#DD002C" Foreground="White" 
                BorderThickness="2" BorderBrush="Black" 
                Click="BtnUpdate_Click" 
                Height="40" Width="130" 
                FontFamily="Verdana" FontStyle="Oblique" 
                FontStretch="ExtraCondensed" FontSize="15" 
                FontWeight="ExtraBlack" 
                MouseEnter="BtnUpdate_MouseEnter" MouseLeave="BtnUpdate_MouseLeave">
        </Button>
    </StackPanel>
</Grid>

КОД позади

public partial class vorhandeneNachbestellungen : Window
{
    public vorhandeneNachbestellungen(string hv)
    {
        InitializeComponent();
        this.DataContext = new vorhandeneNachbestellungenViewModel(hv);                      
    }

Модель просмотра

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace Nachbestellungen
{
    public class vorhandeneNachbestellungenViewModel : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private ObservableCollection<Nachbestellung> _collTop;
        public ObservableCollection<Nachbestellung> CollTop
        {
            get { return _collTop; }
            set
            {
                _collTop = value;
                OnPropertyChanged("CollTop");
            }
        }

        private ObservableCollection<Artikel> _collBot;
        public ObservableCollection<Artikel> CollBot
        {
            get { return _collBot; }
            set
            {
                _collBot = value;
                OnPropertyChanged("CollBot");
            }
        }

        private Nachbestellung _selItem; 
        public Nachbestellung SelItem
        {
            get { return _selItem; }
            set
            {
                _selItem = value;
                OnPropertyChanged("SelItem");
            }
        }

        public vorhandeneNachbestellungenViewModel(string hv)
        {
            try
            {             
                //connecting to database
                var crud = new MongoCRUD("avdb");
                //get filtered records (filtered by Id which is "Hv": hv)            
                var erg = crud.LoadRecords<Nachbestellung>("nachbestellungen", hv);
                //filtered List is an ObservableCollection which is updated with OnPropertyChanged method
                CollTop = new ObservableCollection<Nachbestellung>(erg);

                //same procedure for the articles collection.... 
                //var arterg = crud.LoadRecords<Artikel>("bestellteArtikel", hv);
                CollBot = new ObservableCollection<Artikel>();

                for (int i = 0; i < CollTop.Count; i++)
                {
                    foreach (var a in CollTop[i].artikelliste)
                    {
                        CollBot.Add(a);
                    }                   
                }

                //wenn Abfrageergebnis null ist, dann Messagebox-Info (Zu dieser Hv wurde keine Nachbestellung gefunden!)
                if (CollBot.Count <= 0)
                {
                    MessageBox.Show("Zu dieser Hv wurde keine Nachbestellung gefunden!",
                        "Keine Daten vorhanden!", MessageBoxButton.OK, MessageBoxImage.Information);
                }

            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }           
    }
}

1 Ответ

0 голосов
/ 11 ноября 2019

Свойство SelItem внутри моей модели представления является ключом к успеху, потому что оно выполняет всю работу по объединению за вас. Вам нужно привязать его к TOP DATAGRID, а затем для BOTTOM DATAGRID вы просто привязываете ИСТОЧНИК ПУНКТА к SelValue.PropertyListOfYourModel (в моем случае artikelliste [] внутри REORDER = Nachbestellung) .... Таким образом, вы даже не делаетенужна коллекция CollBot больше !!! ... потому что благодаря магии привязки данных ваш MongoDB уже знает, какие части принадлежат друг другу! Я надеюсь, что это поможет и другим разработчикам в будущем:

XAML

<Window x:Class="Nachbestellungen.vorhandeneNachbestellungen"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Nachbestellungen"
    mc:Ignorable="d"
    WindowStartupLocation="CenterScreen"
    Title="Vorhandene Nachbestellungen" WindowState="Maximized" WindowStyle="ThreeDBorderWindow">

<Window.Resources>
    <Style x:Key="cellLightGray" TargetType="{x:Type TextBlock}">
        <Setter Property="Background" Value="LightGray" />
    </Style>
</Window.Resources>
<!-- View -->
<Grid x:Name="gridVorh">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Vertical">
        <DataGrid x:Name="dgVorh" ItemsSource="{Binding CollTop}" SelectedItem="{Binding SelItem}"
                  Margin="5" Grid.Row="0"
              SelectionMode="Single" SelectionUnit="FullRow" IsReadOnly="False" 
              CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" 
              BorderBrush="Black" BorderThickness="2" RowHeight="30" FontFamily="Arial Narrow" FontSize="18">

        <!-- Style Column Headers -->
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Foreground" Value="#FFFFFF"/>
                <Setter Property="Background" Value="#DD002C"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="BorderThickness" Value="0,0,1,2"/>
                <Setter Property="BorderBrush" Value="Black"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="Height" Value="30"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn Header="Angelegt am" Binding="{Binding Angelegt_am}" IsReadOnly="True">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="TextBlock.Background" Value="LightGray"/>
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Bearbeiter" Binding="{Binding Bearbeiter}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bestelldatum" Binding="{Binding Bestelldatum}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bestellt bei" Binding="{Binding Empfaenger}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferung zu" Binding="{Binding Anlieferungsort}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Liefername" Binding="{Binding Adressat}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferanschrift" Binding="{Binding Anschrift}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Lieferort" Binding="{Binding Plz_Ort}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Liefertermin" Binding="{Binding Liefertermin}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
        </DataGrid.Columns>
    </DataGrid>

    <!-- ARTIKEL ZUR NACHBESTELLUNG -->
    <DataGrid x:Name="dgVorhArtikel" ItemsSource="{Binding SelItem.artikelliste}" 
              Margin="5" Grid.Row="0"
              SelectionMode="Single" SelectionUnit="Cell" IsReadOnly="False" 
              CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" 
              BorderBrush="Black" BorderThickness="2" RowHeight="30" FontFamily="Arial Narrow" FontSize="18">

        <!-- Style Column Headers -->
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Foreground" Value="#FFFFFF"/>
                <Setter Property="Background" Value="#DD002C"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="BorderThickness" Value="0,0,1,2"/>
                <Setter Property="BorderBrush" Value="Black"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="Height" Value="30"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn Header="Pos" Binding="{Binding Pos}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Artikelbezeichnung" Binding="{Binding Artikelbezeichnung}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Artikelnummer" Binding="{Binding Artikelnummer}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Einheit" Binding="{Binding Einheit}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Menge" Binding="{Binding Menge}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Einzelpreis" Binding="{Binding Einzelpreis}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Gesamtpreis" Binding="{Binding Gesamtpreis}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderungsgrund" Binding="{Binding Anforderungsgrund}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderungsnr" Binding="{Binding Anforderungsnr}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Anforderer" Binding="{Binding Anforderer}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Rechnungsnr" Binding="{Binding Rechnungsnr}"/>
            <DataGridTextColumn Header="AB-Nr" Binding="{Binding ABnr}"/>
            <DataGridTextColumn Header="ÄndDatum" Binding="{Binding LetzteAktualisierung}" IsReadOnly="True" ElementStyle="{StaticResource cellLightGray}"/>
            <DataGridTextColumn Header="Bemerkungen" Binding="{Binding Bemerkungen}"/>
        </DataGrid.Columns>
    </DataGrid>
    </StackPanel>

    <StackPanel Name="stpnlUpdate" Grid.Row="1" HorizontalAlignment="Center">
        <Button Name="btnUpdate" Content="Aktualisieren" 
                Background="#DD002C" Foreground="White" 
                BorderThickness="2" BorderBrush="Black" 
                Click="BtnUpdate_Click" 
                Height="40" Width="130" 
                FontFamily="Verdana" FontStyle="Oblique" 
                FontStretch="ExtraCondensed" FontSize="15" 
                FontWeight="ExtraBlack" 
                MouseEnter="BtnUpdate_MouseEnter" MouseLeave="BtnUpdate_MouseLeave">
        </Button>
    </StackPanel>
</Grid>

CODE BEHIND

public partial class vorhandeneNachbestellungen : Window
{
    public vorhandeneNachbestellungen(string hv)
    {
        InitializeComponent();
        this.DataContext = new vorhandeneNachbestellungenViewModel(hv);                      
    }

МОДЕЛЬ ПРОСМОТРА

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace Nachbestellungen
{
    public class vorhandeneNachbestellungenViewModel : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private ObservableCollection<Nachbestellung> _collTop;
        public ObservableCollection<Nachbestellung> CollTop
        {
            get { return _collTop; }
            set
            {
                _collTop = value;
                OnPropertyChanged("CollTop");
            }
        }

        private ObservableCollection<Artikel> _collBot;
        public ObservableCollection<Artikel> CollBot
        {
            get { return _collBot; }
            set
            {
                _collBot = value;
                OnPropertyChanged("CollBot");
            }
        }

        private Nachbestellung _selItem; 
        public Nachbestellung SelItem
        {
            get { return _selItem; }
            set
            {
                _selItem = value;
                OnPropertyChanged("SelItem");
            }
        }

        public vorhandeneNachbestellungenViewModel(string hv)
        {
            try
            {             
                //connecting to database
                var crud = new MongoCRUD("avdb");
                //get filtered records (filtered by Id which is "Hv": hv)            
                var erg = crud.LoadRecords<Nachbestellung>("nachbestellungen", hv);
                //filtered List is an ObservableCollection which is updated with OnPropertyChanged method
                CollTop = new ObservableCollection<Nachbestellung>(erg);

                //same procedure for the articles collection.... 
                //var arterg = crud.LoadRecords<Artikel>("bestellteArtikel", hv);
                CollBot = new ObservableCollection<Artikel>();

                for (int i = 0; i < CollTop.Count; i++)
                {
                    foreach (var a in CollTop[i].artikelliste)
                    {
                        CollBot.Add(a);
                    }                   
                }

                //wenn Abfrageergebnis null ist, dann Messagebox-Info (Zu dieser Hv wurde keine Nachbestellung gefunden!)
                if (CollBot.Count <= 0)
                {
                    MessageBox.Show("Zu dieser Hv wurde keine Nachbestellung gefunden!",
                        "Keine Daten vorhanden!", MessageBoxButton.OK, MessageBoxImage.Information);
                }

            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }           
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...