none
Adding a child to a Stackpanel in RowDetails from Code RRS feed

  • Frage

  • i have a DataGrid with a RowDetails Section. In the rowdetails i have a stackpanel.  I want to add childs dynamically to this stackpanel with code.....but i can't access the panel from the code.

           <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                    <Border x:Name="Border_RowDetails" Margin="5" Padding="3" BorderBrush="Blue" BorderThickness="3" CornerRadius="5">
                        <StackPanel x:Name="StackPanel_Detail" Orientation="Vertical">
                            <TextBlock Foreground="White" FontSize="30" Text="Auftragsdetails:  " Margin="100, 0,0,0"/>
                        </StackPanel>  
                    </Border>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>

    I want to add Childs (Textblocks) to the Stackpanel "StackPanel_Detail" in the code behind file.

    Background:

    The DataGrid has an datatable as the itemssource. If i click on a row, the rowdetails show up and there i should show some more information from another datatable! The number of detailrows is not always the same. I don't really know how to do this with xaml and bindings as i am really new to wpf and xaml. All i could find was to just show other Columns in the rowdetails from the datagrid.itemssource. Therefore i wanted to calculate the number in the code behind and create Textblocks for every record.

    Example:

    Datagrid Row1: Customer1    OrderID1 Details: Row1: OrderID1 COILID1

    Datagrid Row2: Customer2    OrderID2 Details: Row1: OrderID2 COILID1 Row2: OrderID2 COILID2

    I would really appreciate every help. I am sorry for my bad english!

    Regards, Florian

    Dienstag, 12. November 2013 15:37

Antworten

  • Warum StackPanels ihre Items nicht binden können und wie man es doch schaft ist am Anfang sicher auch nicht leicht zu verstehen.

    Das Grundproblem besteht darin, das du das 2. DataTable anhand des selektierten Eintrags des 1. DataTables abfragen musst.

    Ich habe da jetzt eine Idee, die vielleicht funktioniert. Nachfolgend mein funktionierendes Beispiel dazu.

    Mein DataGrid im XAML:

            <DataGrid Name="dg" AutoGenerateColumns="True">
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding }" Loaded="Content_Loaded"  />
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>

    Das Zuweisen des DataTables:

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("ID", typeof(int));
                dt.Columns.Add( "Col", typeof(string));
                dt.Rows.Add(0, "s0");
                dt.Rows.Add(1, "s1");
                dt.Rows.Add(2, "s2");
                dt.Rows.Add(3, "s3");
                dt.Rows.Add(4, "s4");
                dt.AcceptChanges();
                dg.ItemsSource  = dt.DefaultView;
            }

    Sobald eine Zeile ausgewählt wird, wird das Loaded-Event ausgelöst. Daraufhin kannst du die StackPanel-Items generieren:

            private void Content_Loaded(object sender, RoutedEventArgs e)
            {
                if ((sender as ContentPresenter).Content is DataRowView)//Überprüfen ob der Inhalt wirklich ein DataRow ist
                {
                    //Sender in ContentPresenter casten, Content in eine DataRow und Die erste Spalte abfragen und in ein int casten.
                    int id = (int)((sender as ContentPresenter).Content as DataRowView).Row.ItemArray[0];
                    StackPanel sp = new StackPanel();//StackPanel erstellen
                    for (int i = 0; i < id; ++i)
                        sp.Children.Add(new TextBlock(new Run("Item Nr. " + i)));//Items hizufügen
                    (sender as ContentPresenter).Content = sp;//Dem COntentPresenter das StackPanel als Content zuweisen
                }
            }

    Versuche es einfach mal zu verstehen ;)

    Eventuell kann man es noch besser machen, dafür bräuchte ich (bzw. wir) mehr Infos darüber, wie du es genau geplant hast.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert FloSeiler81 Mittwoch, 13. November 2013 08:49
    Dienstag, 12. November 2013 20:36
    Moderator

Alle Antworten

  • Hallo,
    du bist hier im deutschen Forum, du kannst also auch auf Deutsch schreiben ;)

    Da du das StackPanel in einem DataTemplate verwendest kannst du nicht aus dem Codebehind darauf zugreifen.
    Du musst also irgendwie über die jeweilige Datenzeile an deine infos heran kommen.

    Hinweis: Die StackPanel-Items sind nicht so einfach bindbar wie bei einem DataGrid etc. Das einfachste ist, dabei mit einem ItemsControl zu hantieren. Mehr siehe hier.

    Du kannst auch die Items Statisch in das StackPanel rein packen und dann mit einem Konverter die Visibility-Eigenschaft an eine Eigenschaft des DataSets biden. Mehr zu Konvertern gibt es hier.
    Du kannst die Liste aber auch aus dem Codebehind heraus binden, dann haben aber alle Elemente die selben Items im StackPanel.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Dienstag, 12. November 2013 15:51
    Moderator
  • Ok, das mit den ItemsControl hab ich gelesen......steige ich zwar noch nicht so ganz durch, aber werde mir das morgen nochmals genauer anschauen.....im ersten Versuch hat er gar nichts angezeigt! :-(

    Vielleicht gehe ich das ganze auch komplett falsch an. Gibt es eine bessere Möglichkeit mein Problem zu lösen? Vielleicht mit einer Relation zwischen meinen beiden DataTables? Oder vielleicht ein ganz anderer Weg?

    Dienstag, 12. November 2013 17:13
  • Warum StackPanels ihre Items nicht binden können und wie man es doch schaft ist am Anfang sicher auch nicht leicht zu verstehen.

    Das Grundproblem besteht darin, das du das 2. DataTable anhand des selektierten Eintrags des 1. DataTables abfragen musst.

    Ich habe da jetzt eine Idee, die vielleicht funktioniert. Nachfolgend mein funktionierendes Beispiel dazu.

    Mein DataGrid im XAML:

            <DataGrid Name="dg" AutoGenerateColumns="True">
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding }" Loaded="Content_Loaded"  />
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>

    Das Zuweisen des DataTables:

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("ID", typeof(int));
                dt.Columns.Add( "Col", typeof(string));
                dt.Rows.Add(0, "s0");
                dt.Rows.Add(1, "s1");
                dt.Rows.Add(2, "s2");
                dt.Rows.Add(3, "s3");
                dt.Rows.Add(4, "s4");
                dt.AcceptChanges();
                dg.ItemsSource  = dt.DefaultView;
            }

    Sobald eine Zeile ausgewählt wird, wird das Loaded-Event ausgelöst. Daraufhin kannst du die StackPanel-Items generieren:

            private void Content_Loaded(object sender, RoutedEventArgs e)
            {
                if ((sender as ContentPresenter).Content is DataRowView)//Überprüfen ob der Inhalt wirklich ein DataRow ist
                {
                    //Sender in ContentPresenter casten, Content in eine DataRow und Die erste Spalte abfragen und in ein int casten.
                    int id = (int)((sender as ContentPresenter).Content as DataRowView).Row.ItemArray[0];
                    StackPanel sp = new StackPanel();//StackPanel erstellen
                    for (int i = 0; i < id; ++i)
                        sp.Children.Add(new TextBlock(new Run("Item Nr. " + i)));//Items hizufügen
                    (sender as ContentPresenter).Content = sp;//Dem COntentPresenter das StackPanel als Content zuweisen
                }
            }

    Versuche es einfach mal zu verstehen ;)

    Eventuell kann man es noch besser machen, dafür bräuchte ich (bzw. wir) mehr Infos darüber, wie du es genau geplant hast.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert FloSeiler81 Mittwoch, 13. November 2013 08:49
    Dienstag, 12. November 2013 20:36
    Moderator
  • Hallo Koopakiller,

    danke für dein Beispiel, es hat sofort auf Anhieb bei mir funktioniert!

    Habe es natürlich noch an meine Bedürfnisse anpassen müssen, aber vom Grundprinzip her perfekt. Das mit dem ContentPresenter muss ich mir jetzt aber noch mal genauer anschauen, das hat mir bis jetzt nix gesagt und ich habs jetzt natürlich nur dumm abgeschrieben....möchte es aber selbstverständlich verstehen.

    So wie ich das Konzept hinter WPF, XAML und MVVM verstehe müsste die "richtige" Lösung wohl eher in einem DataTemplate und ItemsControl liegen, aber für mich hier zählt zuerst das Ergebnis.

    Hier noch mein Code:

    XAML:

    <Window x:Class="VirtualTPA.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="1080" Width="1922" UseLayoutRounding="False" Visibility="Visible" WindowState="Maximized" WindowStyle="None">
        <Window.Resources>
            <Style x:Key="DatagridColumnHeader" TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Background" Value="White" />
                <Setter Property="Foreground" Value="Black" />
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="Margin" Value="0,0,4,0" />
                <Setter Property="BorderThickness" Value="1,0,0,0"></Setter>
                <Setter Property="BorderBrush" Value="Black"></Setter>
            </Style>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                        <Setter Property="Background" Value="DarkGreen" />
                        <Setter Property="BorderBrush" Value="Black" />
                    </Trigger>
                </Style.Triggers>
            </Style>
            <DataTemplate x:Key="FloDetailTemplate">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Foreground="White" FontWeight="Bold" FontSize="25" Text="Coil-Nr.:" Margin="100, 5, 0, 0"/>
                    <TextBlock Foreground="LimeGreen" Text ="{Binding Baender}" Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="White" FontWeight="Bold" FontSize="25" Text="Letzte Rückmeldung: " Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="LimeGreen" Text ="{Binding Aktuell}" Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="GreenYellow" Text ="{Binding Datum}" Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="Green" Text ="{Binding Zeit}" Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="White" FontWeight="Bold" FontSize="25" Text="Folgeanlage: " Margin="10, 5, 0, 0"/>
                    <TextBlock Foreground="LimeGreen" Text ="{Binding Next}" Margin="10, 5, 0, 0"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <Window.Background>
            <ImageBrush ImageSource="23.jpg" Stretch="Fill"/>
        </Window.Background>
        <Grid Width="1920">
            
            <Label x:Name="Label_Ueberschrift" Content="TPA - Overview" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Width="1920" FontSize="30" FontFamily="Arial Black" HorizontalContentAlignment="Left" Foreground="White"/>
            <DataGrid x:Name="DataGrid_1" HorizontalAlignment="Center" Margin="0,40,0,0" VerticalAlignment="Top" AlternationCount="2" Width="1920" Grid.RowSpan="1" MinWidth="1920" FontSize="25" ItemsSource="{Binding}" MinColumnWidth="70" CanUserAddRows="False" Foreground="Black" BorderBrush="#FF5DA5EC" BorderThickness="0" AutoGenerateColumns="False" UseLayoutRounding="True" RowHeaderWidth="0" RowHeight="40" FontWeight="Bold" TextOptions.TextFormattingMode="Display" IsReadOnly="True" MaxHeight="950" MaxWidth="1920" VerticalScrollBarVisibility="Disabled" MouseDown="DataGrid_MouseDown" >
                <DataGrid.RowBackground>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF8BA3F3" Offset="1"/>
                        <GradientStop Color="#FF0630BD" Offset="0.69"/>
                    </LinearGradientBrush>
                </DataGrid.RowBackground>
                <DataGrid.AlternatingRowBackground>
                    <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                        <GradientStop Color="#FF007FFD" Offset="0.741"/>
                        <GradientStop Color="#FFABD4FD" Offset="1"/>
                    </LinearGradientBrush>
                </DataGrid.AlternatingRowBackground>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Kunde}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Kunde" Width="300" MaxWidth="300"/>
                    <DataGridTextColumn Binding="{Binding Auftrag}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Auftrag"/>
                    <DataGridTextColumn Binding="{Binding Pos}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Pos."/>
                    <DataGridTextColumn Binding="{Binding ETNr}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="ET-Nr."/>
                    <DataGridTextColumn Binding="{Binding FAUF}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="FAUF"/>
                    <DataGridTextColumn Binding="{Binding Soll St}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Soll St"/>
                    <DataGridTextColumn Binding="{Binding Soll Kg}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Soll Kg"/>
                    <DataGridTextColumn Binding="{Binding Ist St}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Ist St"/>
                    <DataGridTextColumn Binding="{Binding Ist Kg}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Ist Kg"/>
                    <DataGridTextColumn Binding="{Binding Datum geplant}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Datum Plan"/>
                    <DataGridTextColumn Binding="{Binding Zeit geplant}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Zeit Plan"/>
                    <DataGridTextColumn Binding="{Binding Lieferschein}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Lieferschein"/>
                    <DataGridTextColumn Binding="{Binding Spedition}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="Spedition"/>
                    <DataGridTextColumn Binding="{Binding LKW}" ClipboardContentBinding="{x:Null}" Foreground="White" Header="LKW" Width="131"/>
                    <DataGridTemplateColumn ClipboardContentBinding="{x:Null}" Header="Fortschritt in %" DisplayIndex="14" Width="265">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Canvas Width="Auto" Height="Auto">
                                    <ProgressBar Value="{Binding Prozent, Mode=OneWay}" Minimum="0" Maximum="100"  FlowDirection="LeftToRight" Width="265" Height="38">
                                        <ProgressBar.Foreground>
                                            <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
                                                <GradientStop Color="#FF1A7006"/>
                                                <GradientStop Color="#FF30FF01" Offset="0.995"/>
                                            </LinearGradientBrush>
                                        </ProgressBar.Foreground>
                                        <ProgressBar.Background>
                                            <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
                                                <GradientStop Color="#FF512222" Offset="0.015"/>
                                                <GradientStop Color="Red" Offset="1"/>
                                            </LinearGradientBrush>
                                        </ProgressBar.Background>
                                    </ProgressBar>
                                    <TextBlock x:Name="textBlock" FontWeight="Bold" FontSize="30" Text="{Binding Prozent}" Foreground="Black" HorizontalAlignment="Center" Margin="100,0,0,0" />
                                </Canvas>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding}" Loaded="ContentPresenter_Loaded_1" />
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>
            <Image HorizontalAlignment="Left" Height="81" Margin="10,991,0,0" VerticalAlignment="Top" Width="64" Source="1.jpg" RenderTransformOrigin="-0.609,0.494"/>
            <Label x:Name="Label_Seite" Content="Seite 1" HorizontalAlignment="Left" Margin="290,991,0,0" VerticalAlignment="Top" Height="81" Width="343" Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="30" FontWeight="Bold"/>
        </Grid>
    </Window>

    Code-Behind:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using SAP.Middleware.Connector;
    using System.Data;
    using System.Globalization;
    using VirtualTPA.Properties;
    
    namespace VirtualTPA
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            DataTable dt;
            DataTable dtMax = new DataTable();
            SAPRFC rfcCall;
            int aktSeite = 1;
            int anzSeiten;
            int aktSeiteLabel;
            Settings settings = new Settings();
            BDEDataSetTableAdapters.sp_fs_VirtualTPATableAdapter vtpa = new BDEDataSetTableAdapters.sp_fs_VirtualTPATableAdapter();
            BDEDataSet.sp_fs_VirtualTPADataTable vtpa_Table = new BDEDataSet.sp_fs_VirtualTPADataTable();
            
    
            public MainWindow()
            {
                
                InitializeComponent();
                rfcCall = new SAPRFC();
                try
                {
                    dt = rfcCall.TPARead();
                    DatatableSortieren();
                    DataTableSpalten();
                    DataTableWerte();
                    DataTableBDEDaten(dt);
                    dtMax = DataTableMaxZeilen(dt);
                    Ueberschrift();
                    DataGrid_1.ItemsSource = dtMax.DefaultView;
                }
                catch
                {
                    MessageBox.Show("Keine Verbindung zu SAP möglich!\nBitte später nochmals probieren!");
                    this.Close();
                }
                
                //Timer fuer Intervall-Abruf der SAP-Daten: 2 Minuten
                System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
                dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
                dispatcherTimer.Interval = new TimeSpan(0, 1, 0);
                dispatcherTimer.Start();
                //Ende Timer
            }
    
            private void DataTableBDEDaten(DataTable dt)
            {
                DataTable dsFAUF = new DataTable();
                try
                {
                    dsFAUF.Columns.Add("FAUF");
                    int i = 0;
                    foreach (var row in dt.Rows)
                    {
                        dsFAUF.Rows.Add();
                        dsFAUF.Rows[i][0] = dt.Rows[i][4].ToString();
                        i++;
                    }
    
                    vtpa.Fill(vtpa_Table, dsFAUF);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }
    
            private DataTable DataTableMaxZeilen(DataTable dts)
            {
                DataTable dt1 = new DataTable();
                dt1 = dts.Copy();
                double anzZeilen = Convert.ToDouble(dt1.Rows.Count);
                //Pruefen ob mehr als 1 Seite benötigt werden
                if (anzZeilen > 22)
                {
                    anzSeiten = Convert.ToInt16(Math.Ceiling(anzZeilen / 22.0));
                }
                else
                {
                    anzSeiten = 1;
                }
                //Zeilen abschneiden welche nicht angezeigt werden sollen
                if (aktSeite ==1)
                {
                    for (int t = 22; t < anzZeilen; t++ )
                        dt1.Rows.RemoveAt(22);
                }
                else
                {
                    for (int t = 0; t < 22; t++)
                        dt1.Rows.RemoveAt(0);
                }
                aktSeiteLabel = aktSeite;
                //Aktuelle Seite immer um 1 ikrementieren
                if (aktSeite == anzSeiten)
                    aktSeite = 1;
                else
                    aktSeite = aktSeite + 1;
    
                return dt1;
                
            }
    
            //Wird bei jedem Timer-Tick ausgefuehrt
            private void dispatcherTimer_Tick(object sender, EventArgs e)
            {
                if (aktSeite == 1)
                {
                    try
                    {
                        dt = rfcCall.TPARead();
                        DatatableSortieren();
                        DataTableSpalten();
                        DataTableWerte();
                    }
                    catch (Exception ex)
                    { 
                        
                    }
                }    
                dtMax = DataTableMaxZeilen(dt).Copy();
                Ueberschrift();
                DataGrid_1.ItemsSource = dtMax.DefaultView;
            }
    
            //Sortieren der Spalten
            public void DatatableSortieren()
            {
                dt.Columns[5].SetOrdinal(0);
                dt.Columns.Remove(dt.Columns[5]);
                dt.Columns[8].SetOrdinal(6);
                dt.Columns.Remove(dt.Columns[8]);
                dt.Columns.Remove(dt.Columns[9]);
                dt.Columns.Remove(dt.Columns[14]);
            }
    
            //Umbenennen der Spalten
            public void DataTableSpalten()
            {
                dt.Columns[0].ColumnName = "Kunde";
                dt.Columns[1].ColumnName = "Auftrag";
                dt.Columns[2].ColumnName = "Pos";
                dt.Columns[3].ColumnName = "ETNr";
                dt.Columns[4].ColumnName = "FAUF";
                dt.Columns[5].ColumnName = "Soll St";
                dt.Columns[6].ColumnName = "Soll Kg";
                dt.Columns[7].ColumnName = "Ist St";
                dt.Columns[8].ColumnName = "Ist Kg";
                dt.Columns[9].ColumnName = "Datum geplant";
                dt.Columns[10].ColumnName = "Zeit geplant";
                dt.Columns[11].ColumnName = "Lieferschein";
                dt.Columns[12].ColumnName = "Spedition";
                dt.Columns[13].ColumnName = "LKW";
                dt.Columns[14].ColumnName = "Prozent"; 
            }
    
            //Formatieren der einzelnen Werte
            private void DataTableWerte()
            {
                foreach (DataRow row in dt.Rows)
                {
                    row[1] = row[1].ToString().Substring(4, 6);
                    row[2] = row[2].ToString().Substring(4, 2);
                    row[3] = row[3].ToString().Substring(3, 1);
                    row[4] = row[4].ToString().Substring(5, 7);
                    row[5] = row[5].ToString().Substring(0, row[5].ToString().Length - 4);
                    row[6] = row[6].ToString().Substring(0, row[6].ToString().Length - 4);
                    row[7] = row[7].ToString().Substring(0, row[7].ToString().Length - 4);
                    row[8] = row[8].ToString().Substring(0, row[8].ToString().Length - 4);
                    row[14] = row[14].ToString().Substring(0, row[14].ToString().Length - 3);
                }
            }
    
            private void Ueberschrift()
            {
                Label_Ueberschrift.Content = "TPA - Overview" + "                                     ";
                Label_Ueberschrift.Content = Label_Ueberschrift.Content + DateTime.Now.ToString("dddd");
                Label_Ueberschrift.Content = Label_Ueberschrift.Content + ", " + System.DateTime.Now.ToShortDateString() + "  " + System.DateTime.Now.ToShortTimeString();
                Label_Seite.Content = "Seite " + aktSeiteLabel + " von " + anzSeiten;
            }
    
            private void DataGrid_MouseDown(object sender, MouseButtonEventArgs e)
            {
                //(sender as DataGrid).SelectedCells.ToArray();
                (sender as DataGrid).SelectedItem = null;
                
            }
    
            private void ContentPresenter_Loaded_1(object sender, RoutedEventArgs e)
            {
                if ((sender as ContentPresenter).Content is DataRowView)//Überprüfen ob der Inhalt wirklich ein DataRow ist
                {
                    //Sender in ContentPresenter casten, Content in eine DataRow und Die erste Spalte abfragen und in ein int casten.
                    string faufId = (string)((sender as ContentPresenter).Content as DataRowView).Row.ItemArray[4];
                    string coils, aktuell, next, datum, zeit;
                    DataRow[] foundRows;
                    foundRows = vtpa_Table.Select("Auftrag = '" + faufId + "'");             
                    StackPanel sp = new StackPanel();//StackPanel erstellen
                    //<TextBlock Foreground="White" FontSize="30" Text="Auftragsdetails:  " Margin="100, 0,0,0"/>
                    TextBlock Ueberschrift = new TextBlock();
                    Ueberschrift.Foreground = System.Windows.Media.Brushes.White;
                    Ueberschrift.FontSize = 30;
                    Ueberschrift.Margin = new System.Windows.Thickness(100,0,0,0);
                    Ueberschrift.Text = "Auftragsdetails:";
                    sp.Children.Add(Ueberschrift);
                    int i = 0;
                    foreach (var rowi in foundRows)
                    {
                        StackPanel sp_horizontal = new StackPanel();
                        sp_horizontal.Orientation = System.Windows.Controls.Orientation.Horizontal;
                        //Coil-Nr. festlegen
                        coils = foundRows[i].ItemArray[3].ToString();
                        TextBlock coil = new TextBlock();
                        coil.Foreground = System.Windows.Media.Brushes.White;
                        coil.FontSize = 25;
                        coil.Margin = new System.Windows.Thickness(100, 0, 0, 0);
                        coil.Text = "Coil-Nr.: " + coils;
                        //Textblock mit Coil-Nr. dem StackPanel hinzufügen
                        sp_horizontal.Children.Add(coil);
                        aktuell = foundRows[i].ItemArray[9].ToString();
                        TextBlock akt = new TextBlock();
                        akt.Foreground = System.Windows.Media.Brushes.White;
                        akt.FontSize = 25;
                        akt.Margin = new System.Windows.Thickness(10, 0, 0, 0);
                        akt.Text = "Letzte Rückmeldung: " + aktuell;
                        sp_horizontal.Children.Add(akt);
                        datum = foundRows[i].ItemArray[6].ToString();
                        zeit = foundRows[i].ItemArray[8].ToString();
                        TextBlock dat = new TextBlock();
                        dat.Foreground = System.Windows.Media.Brushes.White;
                        dat.FontSize = 25;
                        dat.Margin = new System.Windows.Thickness(0, 0, 0, 0);
                        dat.Text = " am " + datum + " um " + zeit;
                        sp_horizontal.Children.Add(dat);
                        next = foundRows[i].ItemArray[10].ToString();
                        TextBlock nex = new TextBlock();
                        nex.Foreground = System.Windows.Media.Brushes.White;
                        nex.FontSize = 25;
                        nex.Margin = new System.Windows.Thickness(10, 0, 0, 0);
                        nex.Text = "Folgeanlage: " + next;
                        sp_horizontal.Children.Add(nex);
                        sp.Children.Add(sp_horizontal);
                        i++;
                    } 
                    (sender as ContentPresenter).Content = sp;//Dem COntentPresenter das StackPanel als Content zuweisen
                }
            }
    
            
        }
    }
    

    Ich habe auch noch eine SAPRFC Klasse, mit welcher ich die DataTable für das DataGrid abrufe. Diese möchte ich jedoch nur sehr ungern hier zur Verfügung stellen wegen eventueller sensibler Daten. Sollte aber auch unwichtig sein, als Ergebnis gibts halt eine DataTable.

    Die 2. DataTable mit den Details hole ich mir von einem SQL Server mit nach jedem Aktualisieren der SAP-DataTable. Ich rufe hier eine Stored Procedure auf, welche als Parameter eine DataTable mit Order IDs als einzigste Spalte übergibt.

    Wenn jemand eine bessere Lösung für die RowDetails hat oder sonstige Anmerkungen/Verbesserungen im Coding hat, immer her damit, ich bin ein begeisterter Lerner und für alle Tips sehr dankbar!

    Viele Grüße

    Florian

    Mittwoch, 13. November 2013 09:02
  • Hallo,

    zum ContentPresenter
    Hierbei handelt es sich um ein Steuerelement, welches einen Inhalt darstellen kann. ContetPresenter sind u.a. anderem auch Border oder ScrollViewer. Der ContentPresenter hat aber keinerlei Erweiterungen wie die anderen Klassen. Diese bräuchten wir hier auch nicht.

    Das 2. DataTable
    Das beste wäre natürlich, wenn du das ganze komplett im XAML erledigen könntest und die Loaded-Methode nicht mehr brauchst. Ich bin kein Experte was den Datenbankzugriff angeht, darum gehen mir in diesem Fall auch die Ideen aus.
    Einen Ansatz hätte ich noch, du müsstest den ContentPresenter an die StoredProcedure des Tables binden. Sobald sich die Procedure ändert, könntest du durch einen Value-Converter die restlichen Daten aus dem 2. DataTable hohlen. Eventuell auch über ein MutliBinding. Du musst nur an die Procedur heran kommen. Eventuell auch mit einer eigenen Ableitung von DataTable.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 13. November 2013 15:44
    Moderator