Laden...

Forenbeiträge von p66y Ingesamt 13 Beiträge

24.07.2012 - 15:48 Uhr

Hallo,

ich programmiere derzeit ein Tool, welches verschiedene Daten aus einer Statisitik aus einer Datenbank in eine Excel-Tabelle schreibt. In dieser Excel Tabelle erstelle ich aus diesen Daten mehrere Diagramme.

Diese Diagramme habe ich bereits fertig formatiert. Jetzt kommt der Knackpunkt: Ich schreibe, je nach Anzahl der Daten in der Datenbank eine verschiedene Anzahl von Zeilen in die Excel-Mappe. Das heißt: Ich muss die Formel (den Wertebereich) der bereits fertigen Diagramme anpassen. Und hier scheitere ich momentan.

Ich habe bereits mit dem Office Open XML SDK versucht den Speicherort der verschiedenen Objekte zu finden, um mich anschließend von dem WorkBookPart abgehend bis zur einzelnen Formel durch zu iterieren, aber das funktioniert leider nicht. Möglicherweise liegt es an einem LINQ Ausdruck - aber ich kann mir nicht vorstellen, dass man sich durch 20 Objekte und Listen durch iterieren soll... (Formula --> StringReference --> categoryAxisData --> barChartSeries --> barChart --> PlotArea --> Chart --> usw). Das ist doch sehr umständlich!

Das geht bestimmt einfacher. (Außer es mit dem StreamReader zu öffnen und die Formeln mit Replace() zu ersetzen. 😉 )

Vielen Dank für eure Hilfe! 😃

26.07.2011 - 11:15 Uhr

Hallo liebes myC# Forum,

ich exportiere einiges an Daten im neuem *.xslx Format, dazu verwende ich die DocumentFormat.OpenXml Bibliothek von Microsoft. Funktioniert soweit auch recht gut, nicht zuletzt auch wegen dem OpenXML Productivty Tool von Microsoft.

Nun möchte ich die Spaltenbreite automatisch anpassen. Habe es bereits so und in anderen Variationen versucht, jedoch ohne Erfolg:

                            Map nMap= new Map();
                            nMap.AutoFit = true;
                            nRow.Append(nMap);

Kann mir jemand sagen, welchem Objekt ich die Map hinzufügen muss? (Wenn es denn so funktioniert).

Grüße,
p66y

13.05.2011 - 09:33 Uhr

Hallo,

du musst einfach die IEnumerator und die IEnumerable Schnittstelle implementieren.

03.05.2011 - 23:09 Uhr
  • eine schleife muss solang laufen, bis nur noch ein kind "drin" ist

Wer braucht schon Schleifen! 😛
Wobei ich mir auch relativ sicher bin, dass man dazu auch eine Formel aufstellen könnte und nicht auf Schleifen/ Rekursion setzen muss.


    class Abzaehlen
    {
        static void Main(string[] args)
        {
            Abzaehlen abzaehlen = new Abzaehlen();

            int AnzahlKinder = 12;
            int Silben = 9;
               
            List<int> Kinder = new List<int>();
           
            //Liste mit Kindern erstellen
            for (int i = 0; i < AnzahlKinder; i++)
            {
                Kinder.Add(i+1);
            }

            Console.WriteLine(abzaehlen.Sieger(Kinder, Silben, 0).ToString());
            Console.ReadKey();
        }

        private int Sieger(List<int> Kinder, int Silben, int Index)
        {

            int RemoveIndex = (Index -1 +Silben < Kinder.Count) ? Index-1 +Silben : ((Index -1 +Silben) % Kinder.Count);
            Kinder.RemoveAt(RemoveIndex);

            return Kinder.Count > 1 ? Sieger(Kinder,Silben,RemoveIndex) : Kinder[0];
        }


14.04.2011 - 18:00 Uhr

Das sieht in der Tat schon mal gut aus.
Vielen Dank. Werde es dann morgen in mein Projekt einbauen. =)

11.04.2011 - 15:35 Uhr

Hallo,

wir sind wieder bei meinem Lieblingsthema: HierarchicalDataTemplate. Und zwar zeige ich gewisse Knoten in einem TreeView an und möchte, nach einem Klick auf jene Knoten, gewisse Daten tabellarisch anzeigen. Dabei habe ich aber folgendes Problem(Bild siehe im Anhang):
Nun, ihr erahnt es wahrscheinlich schon, dass ich nicht für jede Item in der Collection ein DatGrid erstellen möchte, sondern nur eines benöige, in welchem die Daten eingetragen werden.

Über einen kleinen Tipp, wie ich dies zu bewerkstelligen habe, wäre ich sehr denkbar. 😃

            <TreeView ItemsSource="{Binding objKunden}" HorizontalAlignment="Stretch" VerticalAlignment="Top">
                <TreeView.Resources>

                    <HierarchicalDataTemplate DataType="{x:Type DB:tbl_Kunde}" ItemsSource="{Binding tbl_Kommissions}">
                        <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Kunde}" VerticalAlignment="Top" HorizontalAlignment="Stretch" Height="auto" Width="auto" FontSize="16" FontWeight="Bold" />
                        </StackPanel>
                    </HierarchicalDataTemplate>


                    <HierarchicalDataTemplate DataType="{x:Type DB:tbl_Kommission}" ItemsSource="{Binding tbl_Intouch}">
                        <Border BorderThickness="2" BorderBrush="Aqua" HorizontalAlignment="Stretch">
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Width="auto" >
                                <TextBlock Margin="0,0,0,0" Text="{Binding Path=Kommission}" VerticalAlignment="Top" HorizontalAlignment="Stretch"  FontSize="14" FontWeight="Bold" />
                            </StackPanel>
                        </Border>
                    </HierarchicalDataTemplate>

                    <DataTemplate DataType="{x:Type DB:tbl_Intouch}" >
                        <StackPanel Orientation="Horizontal">
                            <DataGrid AutoGenerateColumns="False" 
                                Height="auto" Name="IntoucGrid" Width="auto" 
                                AlternatingRowBackground="Gainsboro"  AlternationCount="2">
                                
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="PCName" 
                                        Binding="{Binding PCName}" />
                                    <DataGridTextColumn 
                                       Header="Produktbezeichnung" 
                                        Binding="{Binding Produktbezeichnung}" />
                                    <DataGridTextColumn 
                                        Header="Seriennummer" 
                                        Binding="{Binding Serial}" />
                                    <DataGridTextColumn 
                                        Header="Produktnummer" 
                                        Binding="{Binding Produktnummer}" />
                                    <DataGridTextColumn 
                                        Header="Bestellnummer" 
                                        Binding="{Binding Ordernummer}" />
                                </DataGrid.Columns>
                           </DataGrid>
                        </StackPanel>
                    </DataTemplate>

                </TreeView.Resources>
            </TreeView>

Grüße,
p66y

11.04.2011 - 00:49 Uhr

Danke für eure Antworten. 😃

Du brauchst nichts anderes als passende DataTemplates, welche festlegen wie die Tabellen angezeigt werden soll. Im einfachsten Fall ist es ja nur jeweils nen DataGrid mit den entsprechenden Definitionen welche Spalten angezeigt werden sollen.

Das ist eine gute Idee.
Werde ich mir mal genauer ansehen. 😃

10.04.2011 - 12:07 Uhr

Hallo,

ich habe mehrere Tabellen, welche ich in meinem Programm darstellen möchte. Nun überlege ich, wie ich dies am besten angehe.

Die Tabellen haben alle unterschiedliche Spaltennamen und als Datentyp entweder int, string, bool oder date. Die Frage ist nun, wie würde man - in einem guten Stil - sich um die Darstellung der Daten kümmern?

  1. DataGrid mit AutoGenerateColumns auf true
    Geht nicht, da ich möchte, dass gewisse Spalten nicht angezeigt werden und diverse Spalten/ Zeilen farblich formatieren möchte.

  2. Für jede Tabelle ein eigenes Usercontrol
    Sooooo viel overhead?

  3. Ein Usercontrol
    Welches überprüft, welche Tabelle es entgegen nimmt und daraufhin die Columns, etc. erstellt. Der Nachteil hier wäre, dass ich alles per C# Code machen müsste und nicht per XAML. Also das Design nicht von der Funktionalität getrennt wäre.

Wenn noch jemand eine gute Idee haben sollte, freue ich mich davon zu hören. 😃

Grüße,
p66y

07.03.2011 - 11:08 Uhr

Dankeschön!
Habe es noch ein wenig angepasst, jetzt läuft es so, wie ich es mir vorstelle.

06.03.2011 - 12:35 Uhr

Hallo,

ich möchte meine Daten in einer TreeView geordnet darstellen.
Funktioniert soweit auch ganz gut. Allerdings nur mit 2 Knoten. Egal, was ich versuche, ich schaffe es nicht, dass auch der dritte Knoten dargestellt wird.

Also, momentan sieht die TreeView folgendermaßen aus:

Ich möchte es allerdings folgendermaßen darstellen:
>Staffel
..>Episode
....>Plot

Meine entsprechenden Klassen sehen folgendermaßen aus:

Im Konstruktor der Form, setze ich die ObservableCollection<Staffel> als DataContext für die Form:


            this.DataContext = new
            {
                objSerie = oSerie.Staffel
            };

Daraufhin möchte ich das ganze in der TreeView darstellen:

 <TreeView Name="trStaffeln" Height="auto" HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch" Width="auto" ItemsSource="{Binding objSerie}">
                               
                                <!-- Staffel template -->
                                <!-- Keine Ahnung, warum hier auf Episode gebunden werden muss und nicht auf Staffel...-->
                                <TreeView.ItemTemplate>
                                    <HierarchicalDataTemplate ItemsSource="{Binding Episode}">
                                        <TextBlock Foreground="Red" Text="Staffel X" />

                                        <!-- Episoden template -->
                                        <HierarchicalDataTemplate.ItemTemplate>
                                            <HierarchicalDataTemplate>
                                                <TextBlock Text="{Binding Titel}" />

                                                <HierarchicalDataTemplate.ItemTemplate>
                                                    <DataTemplate >
                                                        <TextBlock  Text="{Binding RelativeSource={RelativeSource 
                                                            FindAncestor, AncestorType={x:Type HierarchicalDataTemplate}}, 
                                                            Path=Plot}" />
                                                    </DataTemplate>
                                                </HierarchicalDataTemplate.ItemTemplate>

                                            </HierarchicalDataTemplate>
                                        </HierarchicalDataTemplate.ItemTemplate>
                                        
                                    </HierarchicalDataTemplate>
                                </TreeView.ItemTemplate>
                            </TreeView>

Jetzt ergeben sich 2 Probleme:

  • Der dritte Knoten wird nicht angezeigt
  • Titel und Plot der Episode befinden sich in meiner Collection auf der selben "Ebene". Das HierarchicalDataTemplate geht, sofern ich es richtig verstanden habe, aber eine weitere Ebene "nach unten". Nun, dort gibt es die Plot Eigenschaft natürlich nicht mehr. Nach einigem Googlen habe ich es so gelöst, wie oben. Nur weiß ich nicht, ob das klappt.

So, wahrscheinlich habe ich viel zu viel Code gepostet und es müssen nur 3 Zeilen in der XAML Datei geändert werden, damit das ganze nach meinen Vorstellungen funktioniert. Wenn mir jemand sagen könnte, welche, wäre ich sehr dankbar! 😃

Grüße,
p66y

05.03.2011 - 21:15 Uhr

Uih, sogar ein Video. 😃
Danke für deine Antwort.

05.03.2011 - 14:20 Uhr

Hallo,
ich habe noch nicht viel mit Datenbindung gearbeitet. In meinen vorherigen Programmen, bin ich immer den Fußweg gegangen und habe die Daten folgendermaßen in meine Benutzeroberfläche geladen:
*User wählt Eintrag, den er ansehen/ bearbeiten möchte, aus einer ListView aus *Im Click Ereignis führe ich die Datenbankabfrage aus *Speichere die Daten aus der Datenbank in ein Objekt ab *Übergebe das Objekt an die Form (zB im Konstruktor) *Und Stelle die Daten folgendermaßen da: *TextBox1.Text = Objekt1.Eintrag; usw.

Nun, das ganze ist natürlich nicht optimal. Bei meinem neuen Projekt, möchte ich richtig mit Datenbindung arbeiten. Nur weiß ich noch nicht ganz, was die richtige Vorgehensweise ist. Und zwar gibt es meiner Meinung nach 2 Varianten, mit welchen ich arbeiten könnte:
*Ich binde die GUI direkt an die Datenbank *Ich binde die GUI an ein Objekt. Wenn ich das richtig sehe, müsste dieses Objekt dann aber auch eine Update() Methode bereitstellen, welche etwaige Änderungen zurück in die DB schreibt, richtig?

Was ist eurer Meinung nach, der bessere Weg? Und wo liegen die Vor- und Nachteile der einzelnen Methoden?

Grüße,
p66y

27.02.2011 - 15:13 Uhr

Hallo,

ich lade mehrere Bilder aus dem Internet runter. Nach dem Download liegen die Bilder als Objekt der Klasse System.Drawing.Image vor. Da ich allerdings mit WPF arbeite, wäre es schon vorteilhaft, wenn die Bilder sofort als System.Windows.Controls.Image vorliegen würden. Daher möchte ich die Bilder sofort nach dem Download in System.Windows.Controls.Image konvertieren, doch sobald ich eine neue Instanz von System.Windows.Controls.Image innerhalb eines Threads erzeuge, bekomme ich eine Exception: "System.Reflection.TargetInvocationException".

Nun, ich kenne mich nicht so gut in Threading aus. Der Backgroundworker hat meine Bedürfnisse soweit immer erfüllt. Habe zwar ein wenig mit Invokes und Delegates rumgespielt, aber ohne, dass ich zu einem nennenswerten Ergebnis gekommen wäre.

Das ganze mal als Quelltext:

 public static Image DownloadImage(string URL)

        {

            HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);

            HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();

            Stream objstream = httpWebReponse.GetResponseStream();



            //Konvertierung von System.Drawing.Image in System.Windows.Controls.Image

            System.Drawing.Image imgDrawing = System.Drawing.Image.FromStream(objstream);

            Image img = Tools.ConvertSystemDrawingImageToWPFImage(imgDrawing);

            

            return img; 

        }
  public static Image ConvertSystemDrawingImageToWPFImage(System.Drawing.Image tmpImg)

        {

            Image tmpImage = null;

            tmpImage = new Image(); //hier knallts



            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(tmpImg);

            IntPtr hBitmap = bmp.GetHbitmap();

            System.Windows.Media.ImageSource WpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

            tmpImage.Source = WpfBitmap;



            return tmpImage;

        }

Für einen Tipp, wie ich die Konvertierung/ Instanzierung durchzuführen habe, wäre ich sehr dankbar. 😃

P.S.: Ich habe vor circa einer Woche das Problem schon einmal in einem anderen .NET Forum geschildert, dort aber leider keine Antwort erhalten.