Laden...

Forenbeiträge von NameInvalid Ingesamt 4 Beiträge

20.11.2022 - 20:25 Uhr

Hallo zusammen,

ich stehe vor einem Problem wofür ich einen kleinen Denkanstoß bräuchte. Mein untenstehender Code soll eine gelesene Zeile mit ".split()" zerlegen und in einem Array ablegen, soweit so klar. Das Array soll dann in "Labels" in einem WPF Window ausgegeben werden, woran ich aktuell leider scheitere.

Mein Problem liegt darin, beim durchlaufen der Schleife auf das "nächste" Objekt zu springen und auf dies zu verweisen. Mir fehlt einfach der Ansatz wie ich so etwas lösen könnte.


            string InputLine = "1 2 3 4";

            string[] subs = InputLine.Split(' ');

            //lbl_1.Content = subs[0];
            //lbl_2.Content = subs[1];
            //lbl_3.Content = subs[2];
            //lbl_4.Content = subs[3];
            //lbl_5.Content = subs[4];
            //lbl_6.Content = subs[5];
            //lbl_7.Content = subs[6];
            //lbl_8.Content = subs[7];
            //lbl_9.Content = subs[8];
            //lbl_10.Content = subs[9];

            foreach (string sub in subs)
            {
                lbl_1.Content = sub; // "lbl_1" muss variabel sein, bzw. sich "hochzaehlen" lassen
            }

Danke schonmal für die Mühe

18.06.2022 - 19:40 Uhr

Guten Abend,

ich bin aktuell dabei eine kleine simple und universelle Datenbank auf Basis einer XML Datei zu programmieren, in diesem Fall als Beispiel ein simples Kochbuch. Das Binding und die Darstellung der Daten habe ich soweit hinbekommen und auch das Speichern geänderter Daten funktioniert soweit. Als nächstes arbeite ich an einer Funktion um einen neues Element in der Datenbank bzw. der XML zu erzeugen, dies funktioniert auch soweit. Ich stehe nun vor dem Problem, dass meine Listbox mit der Auflistung dieser Elemente Probleme macht, da die neu erzeugten Elemente nicht angezeigt werden, da der XML Provider diese nicht neu lädt. Nach einigen Stunden suche bin ich nun soweit, dass ich mich wohl mit dem "INotifyPropertyChanged" anfreunden muss, ich habe die Klassen bzw. das Model dafür erstellt, nur funktioniert das ganze nicht da ich wohl nach dem falschen Element Ausschau halte und versuche es nun hier mal im Forum.

XAML:


<Window x:Class="EinerDerTests.MainWindow"
        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:EinerDerTests"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    
    <Window.DataContext>
        <local:KochbuchModel/>
    </Window.DataContext>
    
    <Window.Resources>

        <DataTemplate x:Key="KochbuchTemplate">
            <Label Content="{Binding XPath=Name}"/>
        </DataTemplate>

    </Window.Resources>

    <Grid Margin="0,10,0,0">

        <Grid.DataContext>
            <XmlDataProvider x:Name="Kochbuch" Source="KochbuchTest.xml" XPath="Kochbuch/Rezept" />
        </Grid.DataContext>

        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="150" MaxWidth="300"/>
            <ColumnDefinition MinWidth="300" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>

        <DockPanel Grid.Column="0" Margin="5,0,0,0">
            <Border Height="30" Padding="0" Background="#4E87D4" DockPanel.Dock="Top">
                <Label VerticalAlignment="Center" Foreground="White">Rezepte</Label>
            </Border>

            <ListBox x:Name="RezeptListBox" Margin="0,0,0,20" DockPanel.Dock="Left"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource KochbuchTemplate}"
                     IsSynchronizedWithCurrentItem="True"
                     Visibility="Visible" SelectionMode="Single">
            </ListBox>
        </DockPanel>

        <StackPanel Grid.Column="1" Margin="0,0,5,0">

            <StackPanel Orientation="Horizontal">
                <Label VerticalAlignment="Top" HorizontalAlignment="Right" FontWeight="Bold" MinWidth="80">Name:</Label>
                <TextBox Width="300" Margin="0,0,0,0" Text="{Binding XPath=Name}" VerticalAlignment="Center" BorderBrush="{x:Null}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <Label VerticalAlignment="Top" HorizontalAlignment="Right" FontWeight="Bold" MinWidth="80">Aufwand:</Label>
                <TextBox Width="300" Margin="0,0,0,0" Text="{Binding XPath=Aufwand}" VerticalAlignment="Center" BorderBrush="{x:Null}" />
            </StackPanel>

        </StackPanel>

        <DockPanel Grid.Column="1">
            <Button x:Name="RezeptSpeichernButton" Click="RezeptSpeichernButton_Click" Height="20" Width="150">Rezept Aktualisieren</Button>
            <Button x:Name="RezeptErstellenButton" Click="RezeptErstellenButton_Click" Height="20" Width="150">Rezept Erstellen</Button>
        </DockPanel>

    </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 System.Xml;

namespace EinerDerTests
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

 

        public MainWindow()
        {
            InitializeComponent();
            Kochbuch.Source = new Uri("C:/Users/admin/source/repos/EinerDerTests/KochbuchTest.xml");
        }

        private void RezeptSpeichernButton_Click(object sender, RoutedEventArgs e)
        {
            string source = Kochbuch.Source.LocalPath;
            Kochbuch.Document.Save(source);
        }
        private void RezeptErstellenButton_Click(object sender, RoutedEventArgs e)
        {

            XmlDocument Kochbuch = new XmlDocument();
            string source = "C:/Users/admin/source/repos/EinerDerTests/KochbuchTest.xml";
            Kochbuch.Load(source);
            ....
            Kochbuch.Save(source);

        }

    }
}

KochbuchModel.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EinerDerTests
{
    class KochbuchModel
    {
        private string _KochbuchTemplate;

        public string KochbuchTemplate
        {
            get { return _KochbuchTemplate; }
            set { _KochbuchTemplate = value; }
        }

    }
}

ObservableObject.cs


using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace EinerDerTests
{
    class ObservableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName] string propertyname = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
        }
    }
}

Der Code ist noch ziemlich experimentell und an der ein oder anderen Stelle noch murks, aber das ganze dient ja hauptsächlich dass das mal funktioniert

Gruß

16.02.2021 - 22:37 Uhr

Danke für die schnelle Hilfe 👍
Mit den Fachbegriffen hab ich es noch nicht so bzw. kenn ich mich mit den doch etwas komplexeren Methoden in C# noch nicht wirklich aus. Ich kenne bisher Methoden aus C/C++ (Arduinos) und ein wenig LUA und deswegen konnte ich mir unter dem void nie so wirklich was vorstellen bzw. habs halt auch nie anders gebraucht.
Das ich eigentlich nur "private string" brauch hatte ich auch schon rausgefunden, wusste aber noch nicht in welcher Ebene im Code das ganze rein muss, weil es immer nur Fehlermeldungen dazu gab, aber Danke dafür ich bin ja erst am Anfang mit C# und schau mir die Methoden, Klassen etc. gleich mal noch genauer an🙂

16.02.2021 - 18:01 Uhr

Hallo erstmal,
ich bin aktuell Anfänger in C# in Verbindung mit der WPF. Ich habe zum Einstieg in C# ein kleines UI mit einem Code behind welcher im Grunde funktioniert und ich das ganze jetzt immer weiter ausarbeiten möchte, aber jetzt schon an der ersten Hürde scheitere.

Konkret habe ich eine Textbox zum aufnehmen eines Strings dieser String soll mit 2 Eventhandlern verarbeitet werden

  1. Eventhandler "Key-UP" soll den eingegeben Wert zwischenspeichern als String "speed"
  2. Eventhandler "GotMouseCapture" soll den zuvor gespeicherten Wert wieder in die Textbox ablegen sobald reingeklickt wird

Das ganze hat den Hintergrund, dass der Wert durch einen Slider manipuliert wird, aber beim Wunsch des änderns wieder der "Original Wert" angezeigt wird und der Slider zurückgestellt wird.

Problemstellung, ich bekomme den string "speed" natürlich in dem ersten Void zugewiesen, kann ihn aber in dem zweiten Void nicht anwenden, Warum? Ich geh davon aus dass es ziemlich simpel is ich aber nicht draufkomme wo ich den string "freigeben oder "übergeben" kann.


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;

namespace BlaBla
{

    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
        }

        private void box_speed_KeyUp(object sender, KeyEventArgs e)
        {
            string speed = box_speed.Text;
        }

        private void box_speed_GotMouseCapture(object sender, MouseEventArgs e)
        {
            slider_Factor.Value = 100;
            box_speed.Text = speed;
        }
    }
}