Laden...

Forenbeiträge von theSoulT Ingesamt 40 Beiträge

31.01.2022 - 12:22 Uhr

Vielen Dank schonmal für eure Mühen. Leider hab ich mir das alles selber beigebracht und versteh das noch nicht so ganz, was Ihr versucht zu erklären 🙁
Könntet ihr das bitte anhand eines Beispiels erklären? Das ist dann für mich verständlicher 😁

25.01.2022 - 11:49 Uhr

Servus FZelle,

ich bin da noch ziemlich am Anfang und hab das halt so gelernt 🙂
Ich werde es mir mal anschauen.
Aber das hat ja nichts mit meinem eigentlichen Problem zu tun oder?

Lg

24.01.2022 - 11:15 Uhr

Servus Palladin007 und alle anderen 🙂,

bin jetzt etwas weiter und hab meine Variable verschoben.
Aktueller Stand:

StartView.xaml


<StackPanel Orientation="Vertical" Grid.ColumnSpan="2" DataContext="{Binding Source={StaticResource Locator}, Path=DataVM}">
                        <StackPanel.Resources>
                            <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
                                <Setter Property="Background" Value="{DynamicResource clrPrimary}"/>
                                <Setter Property="Margin" Value="0 0 0 10"/>
                                <Setter Property="FontSize" Value="20"/>
                                <Setter Property="Height" Value="Auto"/>
                                <Setter Property="IsEnabled" Value="False"/>
                                <Setter Property="ToolTip" Value="Adapter oder Gerät ist nicht bereit!"/>
                                <Setter Property="ToolTipService.IsEnabled" Value="True"/>
                                <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding DataContext.UnitsModel.Instance.AdaptIsReady, RelativeSource={RelativeSource AncestorType=StackPanel}}" Value="True"/>
                                            <Condition Binding="{Binding DataContext.UnitsModel.Instance.UnitIsReady, RelativeSource={RelativeSource AncestorType=StackPanel}}" Value="True"/>
                                        </MultiDataTrigger.Conditions>
                                        <MultiDataTrigger.Setters>
                                            <Setter Property="IsEnabled" Value="True"/>
                                            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
                                        </MultiDataTrigger.Setters>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Resources>
                        <Button Content="FUT starten" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="startFUT"/>
                        <Button Content="Manuell testen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="manuellTesting"/>
                        <Button Content="PVIS Befehle ausführen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="pvisAction"/>
                    </StackPanel>

DataViewModel.cs (DataVM):


        private UnitsModel untisModel = UnitsModel.Instance;
        public UnitsModel UntisModel
        {
            get { return untisModel; }
            set
            {
                if (untisModel != value)
                {
                    untisModel = value;
                    RaisePropertyChanged();
                }
            }
        }

UnitsModel.cs:


        private static UnitsModel instance = null;
        private static readonly object singletonLock = new object();
        public static UnitsModel Instance
        {
            get
            {
                lock (singletonLock)
                {
                    if (instance == null)
                    {
                        instance = new UnitsModel();
                    }
                    return instance;
                }
            }
        }

        private bool adaptIsReady;
        public bool AdaptIsReady
        {
            get { return adaptIsReady; }
            set
            {
                if (adaptIsReady != value)
                {
                    adaptIsReady = value;
                    OnPropertyChanged();
                }
            }
        }

        private bool unitIsReady;
        public bool UnitIsReady
        {
            get { return unitIsReady; }
            set
            {
                if (unitIsReady != value)
                {
                    unitIsReady = value;
                    OnPropertyChanged();
                }
            }
        }

Leider funktioniert mein Binding mit dem Singleton so nicht, wie ich mir das vorstelle. Hat hier noch jemand einen Tipp?

Lg TheSoulT

11.01.2022 - 13:50 Uhr

{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=StackPanel}}

Normalerweise ist das nicht notwendig, das macht man nur, wenn man aus irgendeinem Grund einen anderen DataContext hat, das aber nicht ändern kann.

Das war aber jetzt genau das, was ich gebraucht habe 🙂
Mein DataContext für den Button hab ihc ja auf MainVM gelegt, da dort die UpdateViewcommand liegt.
Aber die Variable für meine Prüfung liegt in einer anderen VM.

Vielen Dank dir. Jetzt läuft es so, wie ich mir das vorstelle... 👍

11.01.2022 - 09:48 Uhr

Danke dir, das war schon der Hinweis, der mir gefehlt hat. Die Variablen liegen in einer anderen VM.
Ich vermute, es gibt keine Möglichkeit, für die Commands einen anderen DataContext zu setzen, als für meine Variablen, oder?

11.01.2022 - 08:36 Uhr

Hallo zusammen,

ich komm leider bei meinem Programm nicht weiter.
Ich möchte drei Buttons in Abhängigkeit von zwei Variablen in meinem ViewModel auf IsEnabled = True setzen bzw false.
Dazu habe ich mit den MultiDataTriggern versucht auf die Variablen zu binden. Aber leider klappt das nicht so wie ich mir das vorstelle.
Habt ihr noch eine Idee?


                    <StackPanel Orientation="Vertical" Margin="200 10" Grid.ColumnSpan="2">
                        <StackPanel.Resources>
                            <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
                                <Setter Property="Background" Value="{DynamicResource clrPrimary}"/>
                                <Setter Property="Margin" Value="0 0 0 10"/>
                                <Setter Property="FontSize" Value="20"/>
                                <Setter Property="Height" Value="Auto"/>
                                <Setter Property="IsEnabled" Value="True"/>
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding AdaptIsReady}" Value="false"/>
                                            <Condition Binding="{Binding UnitIsReady}" Value="false"/>
                                        </MultiDataTrigger.Conditions>
                                        <Setter Property="IsEnabled" Value="False"/>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Resources>
                        <Button Content="FUT starten" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="startFUT"/>
                        <Button Content="Manuell testen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="manuellTesting"/>
                        <Button Content="PVIS Befehle ausführen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="pvisAction"/>
                    </StackPanel>


        private bool adaptIsReady;
        public bool AdaptIsReady
        {
            get { return adaptIsReady; }
            set
            {
                if (adaptIsReady != value)
                {
                    adaptIsReady = value;
                    RaisePropertyChanged();
                }
            }
        }

        private bool unitIsReady;
        public bool UnitIsReady
        {
            get { return unitIsReady; }
            set
            {
                if (unitIsReady != value)
                {
                    unitIsReady = value;
                    RaisePropertyChanged();
                }
            }
        }

20.08.2021 - 13:19 Uhr

So einfach gehts, danke 🙂

20.08.2021 - 08:46 Uhr

Der Beitrag ist schon etwas älter, aber vielleicht lest ihr ja noch mit 🙂
Wie funktioniert das ganze, wenn das Control Template keinen Button enthält, sondern sowas in der Art:


<Style x:key="{x:Type custom:OverviewButton}" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Aqua"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Rectangle Grid.ColumnSpan="3" Grid.RowSpan="2" RadiusX="10" RadiusY="10" Fill="AliceBlue" Margin="10,20"/>
                        <Grid Margin="10,20">
                            
                            <Grid Width="30" Height="50" Background="yellow" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,0">
                                <Grid.Effect>
                                    <DropShadowEffect BlurRadius="20" RenderingBias="Quality" ShadowDepth="1"/>
                                </Grid.Effect>
                                <materialDesign:PackIcon Kind="{TemplateBinding Logo}" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0, 5"/>
                            </Grid>
                            <TextBlock Text="{TemplateBinding Heading}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" FontFamily="Calibri" FontSize="25"/>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,20,10,0">
                                <TextBlock  Text="{TemplateBinding Text}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="55"/>
                            </StackPanel>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Dann funktioniert das mit den Default Style für einen Button ja nicht. Ich bräuchte da etwas Hilfe 🙂
Ich möchte das kompllete Template als Button ansehen und wenn ich den DefaultStyle eines Button ändere, soll in diesem Fall die Fill Value geändert werden.
Kann man das der Value mit einem Binding sagen?

Lg TheSoulT

17.08.2021 - 11:29 Uhr

Jemand noch eine Idee hier? 🙂

04.08.2021 - 13:20 Uhr

Hallo pinki,

das sieht doch gut aus. Danke dir!

Jetzt hab ich dabei noch das Problem, dass ich eine StaticResource nutze für meine Hauptfarbe (Siehe Zeile 10) die ich im ganzen Projekt nutze. Diese ist in der App.xaml definiert wie folgend:


<Application.Resources>
        <SolidColorBrush x:Key="clrPrimary" Color="#f7ba0b" />
    </Application.Resources>

Möchte ich jetzt den CustomButton aufrufen, bekomme ich die Fehlermeldung:
Die Ressource mit dem Namen "clrPrimary" kann nicht gefunden werden...

Den CustomButton an sich habe ich in der Generic.xaml erstellt. Dort wird jetzt auch die clrPrimary für den Background gesetzt.
Hast du oder jemand anderes hier auch noch einen Tipp?

04.08.2021 - 09:25 Uhr

Hey zusammen,

ich hoffe, ihr könnt mich bei einem weiteren Problem in meinem Projekt unterstützen.
Ich habe mir ein ControlTemplate als Grid Ressource erstellt (Im Anhang auch ein Screenshot von dem Ergebnis):


<Grid.Resources>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Aqua"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Rectangle Grid.ColumnSpan="3" Grid.RowSpan="2" RadiusX="10" RadiusY="10" Fill="AliceBlue" Margin="10,20"/>
                                    <Grid Margin="10,20">
                                        <Grid Width="30" Height="50" Background="{StaticResource clrPrimary}" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,0">
                                            <Grid.Effect>
                                                <DropShadowEffect BlurRadius="20" RenderingBias="Quality" ShadowDepth="1"/>
                                            </Grid.Effect>
                                            <MaterialDesign:PackIcon Kind="About" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0, 5"/>
                                        </Grid>
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" FontFamily="Calibri"/>
                                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,20,0,0">
                                            <TextBlock Text="40/100" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="35"/>
                                        </StackPanel>
                                    </Grid>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Grid.Resources>

Hier sind zwei Texte und ein Logo, welche ich gern beim Aufruf des Template in xaml unterschiedlich belegen würde. Dazu hab ich schon die Info mit dem Binding an den Content gefunden, was auch super funktioniert. Aber wie kann ich den zweiten Text und das Logo ändern?


<Button Grid.Column="0" Grid.Row="1" Content="Offene Geräte&#xa;Eigen/Gesamt"/>

Ich benötige dann ja sowas wie Content2 = "" oder so. Kann man eigene Properties erstellen oder habt ihr eine Idee, wie ich hier weiterkomme? Hab dazu leider nichts gefunden.

Lg TheSoulT

21.02.2021 - 21:17 Uhr

Hallo zusammen,

ich hoffe ihr könnt mir hier etwas weiterhelfen. Ich möchte eine Datenbindung zwischen mehreren Pages erstellen. Ich habe auf der Seite "infos" eine Textbox. Auf meiner MainWindow Page soll ein Label den Inhalt der Textbox anzeigen. Mit unterschiedlichen Buttons kann man zwischen den Seiten wechseln.

Hier sind meine Codeteile:
MainWindow.cs


    public partial class MainWindow : Window
    {
        Person person1;
        public MainWindow()
        {
            InitializeComponent();
            person1 = new Person()
            {
                Name = "John Doe",
                City = "CiytNumberOne"
            };
            this.DataContext = person1;
        }

        private void btnDashboard_Click(object sender, RoutedEventArgs e)
        {
            PageHolder.Content = new dashboard();
        }

        private void Infos_Click(object sender, RoutedEventArgs e)
        {
            PageHolder.Content = new infos();
        }
    }

Person.cs


class Person : INotifyPropertyChanged
    {
        private string _name;
        private string _city;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
        public string City
        {
            get { return _city; }
            set
            {
                _city = value;
                OnPropertyChanged("City");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string info)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

MainWindow.xaml


<Grid>
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Button x:Name="Infos" Content="Infos" Margin="10 0" Click="Infos_Click"/>
                <Button x:Name="btnDashboard" Content="Dashboard" Margin="10 0" Click="btnDashboard_Click"/>
            </StackPanel>
            <Label Content="Name:"/>
            <Label Content="{Binding Name}"/>
            <Separator/>
            <Frame x:Name="PageHolder" Source="infos.xaml" NavigationUIVisibility="Hidden" />
        </StackPanel>
    </Grid>

Könnt ihr mir hier bitte weiterhelfen bei der Datenbindung?

03.09.2020 - 08:20 Uhr

Danke Taipi88, der Tipp war goldrichtig! Man muss das Datum als double übergeben und nicht als formatierten String. So hab ich es jetzt:


DateTime odate = DateTime.Today;
excelWs.Cells[column, 8] = odate.ToOADate();
excelWs.Range["H" + column].NumberFormat = "m/d/yyyy";

Da das Datum dann trotzdem im falschen Format war, hab ich das o.g. NumberFormat gesetzt.
Das hab ich über ein Makro ausgelesen. Komischerweise ist dieses Format Tag.Monat.Jahr.

Also nochmals danke an euch 🙂

31.08.2020 - 23:17 Uhr

Also ich hab jetzt auf deinen Hinweis hin, den Code aus der OpenXML SDK kopiert, um zu testen, wie es hier läuft.
Auch auf diesem Weg hab ich genau das selbe Fehlerbild mit dem Filter.

31.08.2020 - 16:38 Uhr

Ich hab dazu unter Zelle formatieren geschaut. Dort gibt es ja Datumsformate. Hab mal einen Screenshot angehangen.
Mit deinem Vorschlag yyyy-mm-dd klappt es leider auch nicht.

Das ist so ärgerlich... Der Text steht eigentlich richtig drin, wird nur nicht korrekt erfasst von Excel 🙄

31.08.2020 - 16:25 Uhr

Hallo Abt,

ich hab es auch schon so getestet:


excelWs.Range["H" + column].NumberFormatLocal = "TT.MM.JJJJ";

Leider das selbe Problem weiterhin 🙁

31.08.2020 - 10:35 Uhr

Hallo zusammen,

ich hänge an einem kleinen Problem, was ich mithilfe der Suche und Google leider nicht lösen konnte.

Ich habe ein kleines Programm geschrieben, was in einer Excel-Tabelle das aktuelle Datum einträgt. Dieses wird auch ohne Probleme eingetragen. Leider hat Excel hier aber ein Problem mit der Filterfunktion.
Diese trennt die einzelnen Datumsteile nicht auf. Um das kurz zu erklären:
Trägt man von Hand ein Datum ein, erkennt der Filter dieses und spaltet auf in Jahr, Monat und Tag. Dann kann man zum Beispiel alle Einträge aus 2020 anzeigen lassen.

Wenn ich mit meinem Programm das Datum eintrage, wird es als komplettes Datum im Filter angezeigt. Dies kann manuell behoben werden über einen Doppelklick und ein Enter in die entsprechende Zelle.
Das ist aber ein manueller Eingriff und eigentlich unerwünscht.

Ich habe das ganze schon versucht zu lösen mit NumberFormat, was aber leider auch nicht geholfen hat. Hier mal mein Codeausschnitt:

                        
int column = LastColumn();

string[] splitData = txt_Daten.Text.Split();

excelWs.Cells[column, 3] = splitData[2];
excelWs.Cells[column, 2] = splitData[1];
excelWs.Cells[column, 1] = splitData[0];
excelWs.Cells[column, 4] = txt_Fert.Text;
excelWs.Cells[column, 8] = DateTime.Now.ToShortDateString();
excelWs.Range["H" + column].NumberFormat = "MM/DD/YYYY";
excelWs.Cells[column, 9] = DateTime.Now.ToShortTimeString();

Im Anhang noch ein Screenshot von dem Filter. Die letzte Zeile davon sollte eigentlich oben mit einsortiert werden.
Ich hoffe ihr habt eine Idee und könnt mir helfen? 🙂

29.05.2019 - 20:29 Uhr

Hallo Abt,

ja ich meinte vor dem Beenden tut mir leid.

Du hast richtig getippt, ich arbeite mit XAMARIN.
Meinst du mit Elementen die Elemente der Liste?
Also ich habe ja eine Liste mit Personen. Diese Personen enthalten jeweils den Vor und Nachnamen und das Geschlecht.

Das heißt ich muss die Personen speichern?

Benötige ich dafür SQL?

Ich find leider nichts passendes für mich im Internet X(

24.05.2019 - 20:55 Uhr

Hallo zusammen,
ich habe mal wieder ein Problem bei einem meiner Projekte.
Ich möchte eine App mit einer ListView erstellen.
Diese ListView wird von Usereingaben gefüttert und soll nach dem Beenden der App bei einem erneuten Aufruf wieder zur Verfügung stehen. Die ListView besteht aus mehreren Objekten "Person".
Ich bin bei meiner Recherche auf die SharedPreferences gestoßen.
Hier kann man aber leider keine List speichern.
Oder doch?
Könnt Ihr mir hier weiterhelfen?

Liebe Grüße
thesoult

26.04.2019 - 07:56 Uhr

Ich habe jetzt mal per HttpWebRequest mir den Code der Website auslesen lassen:


private void button1_Click(object sender, EventArgs e)
        {
            string url = "https://www.pilz.com/de-INT/search#SEARCH=772100&pilz_group_type=";
            
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            
            Stream receiveStream = myHttpWebResponse.GetResponseStream();
            Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
            
            StreamReader readStream = new StreamReader(receiveStream, encode);
            Console.WriteLine("\r\nResponse stream received.");
            Char[] read = new Char[256];
            
            int count = readStream.Read(read, 0, 256);
            Console.WriteLine("HTML...\r\n");
            while (count > 0)
            {
                String str = new String(read, 0, count);
                Console.Write(str);
                count = readStream.Read(read, 0, 256);
            }
            Console.WriteLine("");
            
            myHttpWebResponse.Close();
            readStream.Close();
        }

Das Ergebnis war unter anderem:

<form class="treffer">
                            Anzahl der Suchergebnisse <span id="pilz-fts-search-result-amount">123</span>
                            <select id="resultsPerPage" size="1" title="Ergebnisse pro Seite">
                                <option value="10">10</option>
                                <option value="20">20</option>
                                <option value="30">30</option>
                                <option value="40">40</option>
                                <option value="50">50</option>
                            </select>
                        </form>
                        <div id="pilz-fts-search-results-container"></div>
                    </div>
                    <nav>
                        <ul class="pagination" id="pilz-fts-search-pagination-container">

wobei hier ja die Zeile

                        <div id="pilz-fts-search-results-container"></div>

interessant ist. Hier scheint es so, als ob der Bereich dazwischen nicht existiert.
Gerade ist mir ausfgefallen, das wenn ich die Website untersuche und über den Debugger rein geh, sieht es identisch aus wie oben. Über den DOM-Explorer sind allerdings zwischen <div id="pilz-fts-search-results-container"> und </div> noch die Links, welche ich benötige 8o

25.04.2019 - 20:40 Uhr

Ich bin dabei, aber weiß allerdings nicht nach was ich genau suchen soll ?(

25.04.2019 - 20:19 Uhr

Hallo Abt,

mein Debugger sagt: "att" war "null".
Und link.Attributes["href"] ist ebenfalls null.

25.04.2019 - 19:41 Uhr

Hallo Abt,
danke für die schnelle Rückmeldung.

Das a[2] hab ich auch schon weggelassen.
Dann ist die NullReferenceException an der Stelle weg, allerdings findet er keine Links und gibt mir bei

                if (att.Value.Contains("#"))

eine NullReferenceException, weil keine Links hier vorhanden sind.

X(

25.04.2019 - 19:16 Uhr

Halo zusammen,

ich benötige mal wieder eure Hilfe 🙂
Nach tagelanger Suche bin ich leider mit meinem Programm noch am Anfang, weil ich hier nicht weiter komme.
Ich möchte von einer Website alle Links auslesen.
Dies habe ich mit folgendem Code versucht:

private void button1_Click(object sender, EventArgs e)
        {
            var url = "https://www.pilz.com/de-DE/search#SEARCH=772100&pilz_group_type=";
            var web = new HtmlWeb();
            var doc = web.Load(url);

            var node = doc.DocumentNode.SelectNodes("//*[@id=\"pilz-fts-search-results-container\"]/a[2]");

            foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//*[@id=\"pilz-fts-search-results-container\"]/a[2]"))
            {
                HtmlAttribute att = link.Attributes["href"];
                if (att.Value.Contains("#"))
                {
                    string[] substring = att.Value.Split('#');
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.Write(substring[0]);
                    Console.ReadLine();
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.WriteLine(att.Value);
                    Console.ReadLine();
                }
            }
        }

In der foreach-Schleife bekomm ich ein NullException-Error.
Deshalb habe ich die var node erstellt, um zu sehen ob ich null bekomme, was hier der Fall ist.
Könnt Ihr mir sagen was an dem XPATH nicht in Ordnung ist?

Hier noch der Link zur Website:
https://www.pilz.com/de-DE/search#currentPage=1&SEARCH=772100&search_connector=and

Wenn es genauer geht mit den Links:
Ich möchte die Links in der Mitte haben (Wo ein Pfeil davor ist)

Ich hoffe ihr könnt mir helfen 😁

Grüße
theSoulT

12.03.2019 - 18:30 Uhr

Im Sinne der Wiederverwendbar- und Testbakeit ist es besser, wenn Deine Methode keine Abhängigkeit an die UI und damit keine Abhängigkeit an die Textbox hätte; sondern wie meine Vorlage einen String annimmt und einen zurück gibt.

Du hast recht, das muss ich noch anpassen. Danke dir!

09.03.2019 - 00:10 Uhr

Hab es hinbekommen. Danke für deinen Ansatz!
Hier noch mein Code, falls jemand anderes noch die selben Probleme hat:

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (counter == 0)
                Blockformat(textBox1, 40);
        }
        public void Blockformat(TextBox source, int maxCharsPerLine)
        {
            string gesamttext = source.Text;
            string zeile = "";
            int lastSpace;
            List<string> satz = new List<string>();

            counter = 1;
            if (gesamttext.Length >= maxCharsPerLine)
            {
                while (gesamttext.Length > 0)
                {
                    int min = Math.Min(gesamttext.Length, maxCharsPerLine);
                    zeile = gesamttext.Substring(0, min);
                    lastSpace = zeile.LastIndexOf(" ") + 1;

                    if (lastSpace > 0)
                    {
                        if (gesamttext.Length > maxCharsPerLine)
                        {
                            zeile = gesamttext.Substring(0, lastSpace);
                            gesamttext = gesamttext.Substring(lastSpace).Replace(Environment.NewLine, "");
                        }
                        else
                            gesamttext = "";
                        satz.Add(zeile);
                    }
                    else
                    {
                        zeile = gesamttext.Substring(0, min);
                        if (zeile != "")
                            satz.Add(zeile);
                        gesamttext = gesamttext.Substring(min).Replace(Environment.NewLine, "");
                    }
                }
                source.Text = "";
                foreach (string s in satz)
                {
                    source.Text += s + Environment.NewLine;
                }
                source.Text = source.Text.Substring(0, source.Text.Length - Environment.NewLine.Length);
                source.SelectionStart = source.Text.Length;
                source.ScrollToCaret();
            }

            counter = 0;
        }
08.03.2019 - 17:02 Uhr

Servus und danke erstmal für deinen Vorschlag.
Das Problem ist nur das es in jeder Zeile überprüft werden soll. Und damit hab ich meine Probleme 😭

08.03.2019 - 14:30 Uhr

Mein Problem ist folgendes:
ich müsste Zeile für Zeile kontrollieren, ob mehr als 72 Zeichen stehen. Wenn ja dann sollen alle worte über 72 in die nächste Zeile geschrieben werden.

Ich hätte das jetzt mit foreach(string lines in TextBox1.Lines) gemacht.
Allerdings ist hier das Problem das ich dann lines nichts zuweisen kann.

            
 private void textBox1_TextChanged(object sender, EventArgs e)
        {
         foreach (string lines in textBox1.Lines)
            {
                string[] zeile = lines.Split();
                char[] buchstaben = lines.ToCharArray();
                int count = 0;
                int lastWord = 0;

                if (buchstaben.Length > maxCount)
                {
                    for (int i = 0; i < zeile.Length; i++)
                    {
                        if (count < maxCount)
                        {
                            count += zeile[i].Length;
                        }
                        else
                        {
                            lastWord = i;
                            break;
                        }
                    }
                    for(int i = 0; i < lastWord; i++)
                    {
                        gesamttext += zeile[i] + " ";
                    }
                    gesamttext += Environment.NewLine;
                    for(int i = lastWord; i < zeile.Length; i++)
                    {
                        gesamttext += zeile[i] + " ";
                    }
                    textBox1.Text = gesamttext;
                }
            }
        }

Das hier ist mein aktueller Versuch, aber das klappt leider auch nicht so ganz 😦

08.03.2019 - 13:35 Uhr

Hallo zusammen,

ich benötige mal wieder eure Hilfe,
ich komme einfach nicht weiter. Für ein Projekt benötige ich einen automatischen Zeilenumbruch. Das heißt ich schreibe in einer Multiline-TextBox meinen Text. Es sollen in jeder Zeile maximal 72 Zeichen stehen. Das heißt wenn ein Wort bei 70 anfängt und über 72 geht soll das ganze Wort in die nächste Zeile geschrieben werden. Leider bekomme ich das nicht hin. Habt ihr da einen Ansatz? Oder gibt es für TextBoxen schon Einstellungsmöglichkeiten für die maximale Anzahl pro Zeile?

22.01.2019 - 21:01 Uhr

ist zwar unwahrscheinlich, aber ist das ein frisch installierter SAP GUI 7.50? Dann könnte einmal neustarten ausreichen. Das Ding hat nach der Installation ein paar Grafikfehler, die nach dem Neustart aber weg sind.

Servus GarlandGreene,

nein ist nicht neu installiert 😁
Wenn ich SAP normal starte, ist die Ansicht auch normal.
Das muss an dem Code liegen 😭

22.01.2019 - 17:32 Uhr

Du hast eine Konsolenapplikation erstellt, und darin läuft dann keine Nachrichtenbearbeitungsschleife (message queue).
Probiere mal z.B. eine WinForms-Applikation.

Habe ich auch schon versucht, leider ohne Erfolg. Echt ärgerlich 😭

22.01.2019 - 16:42 Uhr

Hallo zusammen,
ich bin grade dabei eine Verbindung von einer Userform ins SAP zu erstellen.
Mit meinem momentanen Code bekomme ich auch eine Verbindung, allerdings ist das SAP Fenster in einer komischen Ansicht (Buttons werden zum Beispiel nicht angezeigt) Siehe Screenshot. Weiß jemand woran das liegt?
Hier meine Main:

public static void Main(string[] args)
        {
            SAPActive.openSAP("R3Q ECC Testsystem EHP8");
            SAPActive.login("001", "user", "pw", "DE");
            SAPActive.SapSession.StartTransaction("CS12");
        }

Dazu die zwei Funktionen:

       public static void login(string myclient, string mylogin, string mypass, string mylang)
        {
            GuiTextField client = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-MANDT", "GuiTextField");
            GuiTextField login = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BNAME", "GuiTextField");
            GuiTextField pass = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BCODE", "GuiPasswordField");
            GuiTextField language = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-LANGU", "GuiTextField");
    
            client.SetFocus();
            client.Text = myclient;
            login.SetFocus();
            login.Text = mylogin;
            pass.SetFocus();
            pass.Text = mypass;
            language.SetFocus();
            language.Text = mylang;
    
            //Press the green checkmark button which is about the same as the enter key 
            GuiButton btn = (GuiButton)SapSession.FindById("/app/con[0]/ses[0]/wnd[0]/tbar[0]/btn[0]");
            btn.SetFocus();
            btn.Press();
    
        }

        public static void openSAP(string env)
        {
            SAPActive.SapGuiApp = new GuiApplication();
            string connectString = null;
            if (env.ToUpper().Equals("DEFAULT"))
            {
                connectString = "R3Q ECC Testsystem EHP8";
            }
            else
            {
                connectString = env;
            }
            SAPActive.SapConnection = SAPActive.SapGuiApp.OpenConnection(connectString, Sync: true);     
            SAPActive.SapSession = (GuiSession)SAPActive.SapConnection.Sessions.Item(0);   }

Die Buttons sind allerdings vorhanden. Wenn man lange genug mit der Maus über dem Button sit, erscheint ein Tooltip und der Button funktioniert dann auch. Ich hab ehct keine Ahnung woran das liegt 😦

Liebe Grüße TheSoulT

27.12.2018 - 23:59 Uhr

daran sieht man aber leider immer noch nicht, wo das Image herkommt, und auch nicht, wie es geladen wird

Hier wird das Bild geladen:

        private void FrmOp_AcceptOpenFrame(string sFile)
        {
            tabControl1.Visible = true;
            btnPreview.Visible = true;
            lblChoice.Visible = false;
            btnSave.Visible = true;

            Kontakt k = new Kontakt();
            k = Kontakt.OpenContact(sFile,sKey,sIv);
            this.txtName.Text = k.sName;
            this.txtFirstName.Text = k.sFirstName;
            this.txtTitel.Text = k.sTitel;
            this.txtSpitzname.Text = k.sSpitzname;
            if (k.bIsFemale)
            {
                this.rbtnFemale.Checked = true;
            }
            else { this.rbtnMale.Checked = true; }
            this.iContactPicture = Kontakt.StringToImage(k.sContactPicture);
            this.pictureContact.Image = iContactPicture;
        public static Image StringToImage(string sImage)
        {
            MemoryStream MS = new MemoryStream(Convert.FromBase64String(sImage));
            Image img = Image.FromStream(MS);
            MS.Close();
            return img;
        }

Danke euch, hab den Fehler gefunden. Das MS.Close() ist hier nicht richtig. Das ist schuld an der Fehlermeldung 😃
Vielen Dank für eure Mühen!

27.12.2018 - 01:03 Uhr

Interessanter Code.... da scheint jemand (vermutlich ein Kollege von Dir..?) von einer anderen Programmiersprache zu kommen und versucht dortige Muster auf C# umzumünzen 😉
)

Videotutorial 🙂 Ich wollte den Code jetzt etwas anpassen aber komm hier nicht weiter 🙁

Was für Dich eine "Hauptklasse" ist weiß ich nicht

Ich meinte damit nur die Klasse meiner Hauptuserform 😉

Wo auch immer das Image Objekt verwaltet wird; wird wohl nicht richtig verwaltet.

Hmm und was mach ich da jetzt? ?(

27.12.2018 - 00:52 Uhr

Es ist nicht mal im Ansatz erkenntlich, wie die Methode ImageToString verwendet wird.

Sorry hier der Code:

public void SetGeneralVars(string sSpitzname, string sTitel, string sBirthday, Image contactPicture)
        {
            this.sSpitzname = sSpitzname;
            this.sTitel = sTitel;
            this.sBirthday = sBirthday;
            this.sContactPicture = ImageToString(contactPicture, contactPicture.RawFormat);
        }

Die ImageToString Methode und SetGeneralVars sitzen beide in der 2. Klasse.
Das Bild wird in der Hauptklasse geöffnet und in eine Variable gespecihert und dann über SetGeneralVars an die zweite Klasse übergeben.

27.12.2018 - 00:25 Uhr

Guten Abend zusammen,

ich habe leider mit meinem Code ein kleines Problem und komme nicht weiter.
Ich habe eine Userform mit mehreren Buttons. Dazu eine PictureBox
Das Bild wird wie folgend hochgeladen:

private void btnLoadPicture_Click(object sender, EventArgs e)
        {
            OpenFileDialog OF = new OpenFileDialog();
            OF.Title = "Bitte Bild wählen...";
            OF.Multiselect = false;
            OF.Filter = "Bilder|*.jpeg;*.jpg;*.png;*.bmp|JPG-Bilder|*.jpeg;*jpg|PNG-Bilder|*.png|BMP-Bilder|*.bmp";
            DialogResult DR = OF.ShowDialog();

            if (DR == DialogResult.OK)
            {
                iContactPicture = Image.FromFile(OF.FileName);
                pictureContact.Image = iContactPicture;
            }
            else
            {
                pictureContact.Image = global::Personaldaten.Properties.Resources.Who_is_it;
            }
        }

Drücke ich auf den Button Save wird das Bild in einen String umgewandelt und zusammen mit den Infos aus den Textboxen in einer Datei gespeichert:

 private string ImageToString(Image img, ImageFormat imgFormat)
        {
            string sImg;
            MemoryStream MS = new MemoryStream();
            img.Save(MS, imgFormat); //Hier tritt der Fehler auf!!!!
            sImg = Convert.ToBase64String(MS.ToArray());
            MS.Close();
            return sImg;
        }

Über einen Öffnen Button kann ich jetzt die Inhalte der Textboxen und der PictureBox wieder mit den Inhalten der Datei befüllen. Drücke ich jetzt direkt wieder auf Speichern (weil ich irgendwelche Textboxen geändert habe) bekomme ich den im Titel genannten Fehler. Wenn ich aber erneut ein Bild auswähle bekomme ich diesen Fehler nicht.

Ich hoffe ihr könnt mir weiterhelfen 😃

Vielen Dank schon mal.

27.12.2018 - 00:08 Uhr

Löscht man die Zeile fs.Close(); oder kommentiert sie aus, verschwindet der Fehler.

herbivore

Das Problem sit, das ich dieseLÖsung nicht nutzen kann, weilin dem Code kein fs.close() vorhanden ist 😦
Aber ich werde nochmal ein neues thema mit meinem code eröffnen. Vllt reden wir ja auch aneinander vorbei 😃

26.12.2018 - 23:40 Uhr

aber meiner sieht identisch aus 😃
Er hat kein fs.close() und ich auch nicht 😛

26.12.2018 - 22:16 Uhr

Servus herbivore,

nur nutzen leider weder der threadersteller noch ich fs.Close().
Also wir haben das beide nicht in unserem Code 😄

25.12.2018 - 12:45 Uhr

Hallo zusammen,
kann mir jemand weiterhelfen? Ich habe eigentlich den identischen Code wie oben beschrieben und auch das identische Fehlerbild. Leider hilft es auch nichts den MemoryStream offen zu halten. Also wenn ich die Zeile MS.Close() auskommentiere tritt der Fehler immernoch auf.

Wäre dankbar für eure Hilfe 🙂

Liebe Grüße Tony