Laden...

Forenbeiträge von JKruse Ingesamt 60 Beiträge

26.07.2009 - 17:07 Uhr

Hallo Michael,

vielen Dank das funktioniert.

Du hattest recht. Ich habe um meine Listbox herum eine Border, daher war ich irgendwie immer bei dem Gedanken, dass meine Listbox so breit ist... Ist sie aber gar nicht...

Also, vielen Dank noch mal!!

Viele Grüße
Jens

26.07.2009 - 15:43 Uhr

Hallo,

ich habe zur Zeit ein Problem mit meiner Listbox und der Darstellung der Scrollbar, wenn die Listbox nicht gefüllt ist.
Bei gefüllter Listbox wird die Scrollbar so wie es sein soll rechts am Rand der Listbox dargestellt. Bei nicht gefüllter Listbox wird die Scrollbar aber auf einmal links dargestellt.

Meine Listbox sieht wie folgt aus:

<ListBox x:Name="lstbxMonthDetails" Height="192px" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=MyItems}" Margin="0,1,0,0" SelectedItem="{Binding Path=MyItem}" ItemTemplate="{DynamicResource MyItemsTemplate}"></ListBox>

Dazu mein entsprechendes Template:

<DataTemplate x:Key="MyItemsTemplate">
  <StackPanel>
    <StackPanel Orientation="Horizontal" Height="32px">
      <TextBox Width="116px"></TextBox>
      <TextBox Width="116px"></TextBox>
      <TextBox Width="305px"></TextBox>
      <TextBox Width="80px"></TextBox>
    </StackPanel>
  </StackPanel>
</DataTemplate>

Mein Listbox-Style:

<Style x:Key="{x:Type ListBox}" TargetType="{x:Type ListBox}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBox">
        <ScrollViewer Margin="0" VerticalScrollBarVisibility="Visible">
          <ItemsPresenter/>
        </ScrollViewer>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Mein Listboxitem-Style:

<Style TargetType="{x:Type ListBoxItem}" x:Key="{x:Type ListBoxItem}">
  <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
  <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
  <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
        <Grid>
          <Rectangle SnapsToDevicePixels="True" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" RadiusX="4" RadiusY="4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" x:Name="Rectangle" />
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" x:Name="ContentPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
        </Grid>
        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="{StaticResource TextBoxForegroundBrush}" />
            <Setter Property="Background">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Color="#FF909090" Offset="0.0"/>
                </LinearGradientBrush>
              </Setter.Value>
            </Setter>
            <Setter Property="BorderBrush" Value="#FF000000"/>
          </Trigger>
          <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="{StaticResource TextBoxForegroundBrush}" />
            <Setter Property="Background">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Color="#FF909090" Offset="0.0"/>
                </LinearGradientBrush>
              </Setter.Value>
            </Setter>
            <Setter Property="BorderBrush" Value="#FF000000"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Und schließlich mein ScrollViewer-Style:

<Style x:Key="FavsScrollViewer" TargetType="{x:Type ScrollViewer}">
  <Setter Property="OverridesDefaultStyle" Value="True"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ScrollViewer}">
        <Grid>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
          </Grid.RowDefinitions>
          <ScrollContentPresenter Grid.Column="1"/>
          <ScrollBar Name="PART_VerticalScrollBar"
            Value="{TemplateBinding VerticalOffset}"
            Maximum="{TemplateBinding ScrollableHeight}"
            ViewportSize="{TemplateBinding ViewportHeight}"
            Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
          <ScrollBar Name="PART_HorizontalScrollBar"
            Orientation="Horizontal"
            Grid.Row="1"
            Grid.Column="1"
            Value="{TemplateBinding HorizontalOffset}"
            Maximum="{TemplateBinding ScrollableWidth}"
            ViewportSize="{TemplateBinding ViewportWidth}"
            Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Könnt ihr irgendetwas erkennen, bzw. habt ihr eine Idee, wie ich die Scrollbar bei nicht gefüllter Listbox nach rechts bekomme?

Viele Grüße
Jens

03.07.2009 - 11:37 Uhr

Kannst du noch ein paar weitere Angaben machen?
Bei SourceForge habe ich lediglich C# / ADO Entity Framework gesehen...

15.06.2009 - 16:49 Uhr

Hallo winSharp93,

also es scheint tatsächlich an dem Style zu liegen, was mich aber irritiert, weil alle anderen ComboBoxen richtig dargestellt werden (Auch mit Mode=OneWay oder Mode=TwoWay).

Ich werde mal überlegen, ob ich dafür ein neues ViewModel verwende.
Die Frage ist jetzt wahrscheinlich etwas überflüssig, aber ich benötige die Bundesländer mit dem dazugehörenden Schlüssel nur in einem Dialog, weil ich in den Schlüssel brauche. Sollte man dafür wirklich ein komplett neues ViewModel aufbauen? Wenn ja, wo würdest du die Collection denn mit Daten füllen? Ich habe das Dictionary verwendet, weil es mir eigentlich für meinen Gebrauch genügt. Was wäre denn "sauberer"?

Viele Grüße
Jens

15.06.2009 - 15:39 Uhr

Moin,

ich habe ein kleines "Problem", welches ich mir nicht richtig erklären kann:

Ich habe folgenden XAML-Code:

<ComboBox Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Path=GermanStates, Mode=OneTime}" SelectedValue="{Binding Path=SelectedGermanState, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,4,4,4">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=Key}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

Dazu habe ich in meinem ViewModel folgendes:

public Dictionary<string, string> GermanStates
{
  get { return Constants.GermanStates; }
}

public KeyValuePair<string, string> SelectedGermanState
{
  get { return this.selectedGermanState; }
  set
  {
    this.selectedGermanState = value;
  }
}

Meine "GermanStates" fülle ich folgendermaßen:

public static Dictionary<string, string> GermanStates
{
  get
  {
    Dictionary<string, string> germanStates = new Dictionary<string, string>();
    germanStates.Add("Baden-Württemberg", "01");
    germanStates.Add("Bayern", "02");
    germanStates.Add("Berlin", "03");
    germanStates.Add("Brandenburg", "04");
    germanStates.Add("Bremen", "05");
    germanStates.Add("Hamburg", "06");
    germanStates.Add("Hessen", "07");
    germanStates.Add("Mecklenburg-Vorpommern", "08");
    germanStates.Add("Niedersachsen", "09");
    germanStates.Add("Nordrhein-Westfalen", "10");
    germanStates.Add("Rheinland-Pfalz", "11");
    germanStates.Add("Saarland", "12");
    germanStates.Add("Sachsen", "13");
    germanStates.Add("Sachsen-Anhalt", "14");
    germanStates.Add("Schleswig-Holstein", "15");
    germanStates.Add("Thüringen", "16");
    return germanStates;
  }
}

Mein Problem ist jetzt, dass am Ende meiner ComboBox jedes Mal eine Leerzeile angezeigt wird, und ich kann mir nicht erklären, woran das liegt. Übersehe ich etwas?

Im Anhang befindet sich noch eine XAML-Datei mit meinem ComboBox-Style (Achtung: Die Datei ist nicht kommentiert, und sieht noch etwas unstruktiert aus...)

Könnt ihr mir sagen, woran das Problem mit der Leerzeile liegt?

Viele Grüße
Jens

11.06.2009 - 16:25 Uhr

Hallo winSharp93,

vielen Dank, dass war eine gute Idee.
Habe es jetzt wie folgt gelöst:

<Style>
...
<DataTrigger Binding="{Binding Path=Date, Converter={StaticResource dateColorConverter}}" Value="True">
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <GradientStop Color="#FF334455" Offset="0.0"/>
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>
</DataTrigger>
...
</Style>

Viele Grüße
Jens

11.06.2009 - 15:10 Uhr

Hallo zusammen,

erst einmal mein Source-Code (auszugsweise):

"MonthView.xaml":

<ListBox x:Name="lstbxMonthDetails" Height="384px" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=MonthDetails}" Margin="0,1,0,0" SelectedItem="{Binding Path=SelectedWorkingDay}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <StackPanel x:Name="DisplayStackPanel" Orientation="Horizontal" Height="32px">
          <Label x:Name="lblDate" Content="{Binding Path=Date}" Width="40px" ContentStringFormat="{}{0:ddd., }" HorizontalAlignment="Left" Margin="4,3,0,0"></Label>
        </StackPanel>
        <StackPanel x:Name="EditableStackPanel" Orientation="Horizontal" Height="32px" Visibility="Collapsed">
        <toolkit:DatePicker Margin="4,4,0,4" SelectedDate="{Binding Path=Date, Mode=TwoWay}" Width="116px" BorderThickness="1" VerticalContentAlignment="Stretch" BorderBrush="Black"></toolkit:DatePicker>
        </StackPanel>
      </StackPanel>
      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
          <Setter TargetName="EditableStackPanel" Property="Visibility" Value="Visible"/>
          <Setter TargetName="DisplayStackPanel" Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsMouseOver}" Value="True">
          <Setter TargetName="lblDate" Property="Foreground" Value="Black"/>
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

dazu habe ich in meiner "Theme.xaml" folgenden Style:

<Style TargetType="{x:Type ListBoxItem}" x:Key="{x:Type ListBoxItem}">
  <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
  <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
  <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
        <Grid>
          <Rectangle SnapsToDevicePixels="True" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" RadiusX="4" RadiusY="4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" x:Name="Rectangle" />
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" x:Name="ContentPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
        </Grid>
        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="{StaticResource TextBoxForegroundBrush}" />
            <Setter Property="Background">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Color="#FF909090" Offset="0.0"/>
                </LinearGradientBrush>
              </Setter.Value>
            </Setter>
            <Setter Property="BorderBrush" Value="#FF000000"/>
          </Trigger>
          <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="{StaticResource TextBoxForegroundBrush}" />
            <Setter Property="Background">
              <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Color="#FF909090" Offset="0.0"/>
                </LinearGradientBrush>
              </Setter.Value>
            </Setter>
            <Setter Property="BorderBrush" Value="#FF000000"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Meine Datei "Themes.xaml" befindet sich in einer separatan .dll, da ich mehrere Themes zum Wechseln anbieten möchte.

Ich habe in meinem ViewModel die Eigenschaft "Date". Jetzt würde ich gerne die Zeile mit dem aktuellen Datum farblich hervorheben.

Dazu meine Frage(n):

Ist das überhaupt möglich?
Wenn ja, liege ich da richtig, dass das Ganze in meiner Datei "Theme.xaml" einzubauen ist?
Wie komme ich denn an meine Eigenschaft "Date" heran?

Ich habe versucht die Fill-Eigenschaft des Rectangle in dem Style per IValueConverter zu ändern. Leider ohne Erfolg.

Ich hoffe, ihr könnt mir helfen.

Viele Grüße
Jens

10.06.2009 - 12:50 Uhr

Hi,

ja, es ist so gewollt. Nur die Zeile soll aktiviert bleiben, damit er seine Falscheingaben korrigiert.
Ich hatte mir Anfang des Jahres mal die ValidationRules angeschaut, hatte aber dabei Probleme die Fehlermeldungen außerhalb der ListBox anzuzeigen. (Bei dotnet-gui.com) gibt es dazu einen Thread.

Ich muss gestehen, ich hatte mal SelectedItem verwendet, es dann aber warum auch immer getauscht. Ich werde es aber noch mal prüfen und dann ggf. wieder umstellen.

// Edit: Ich habe es wieder umgestellt...

10.06.2009 - 09:51 Uhr

Hallo,

vielen Dank mit dem Code funktioniert es. 🙂
Ich habe nur "SelectedItem" durch mein "SelectedWorkingDayIndex" ersetzt.

Viele Grüße
Jens

09.06.2009 - 15:50 Uhr

Hallo Lector,

vielen Dank für den Hinweis.

Es war leider eine Anforderung, dass die Felder in der jeweiligen Zeile editiert werden sollen.

Viele Grüße
Jens

09.06.2009 - 15:29 Uhr

Hallo winSharp93,

zum besseren Verständnis.
Mit folgendem Code geht es auch nicht (auch, wenn ich im set nur das OnPropertyChanged drin lasse):


public int SelectedWorkingDayIndex
{
  get { return this._selectedWorkingDayIndex; }
  set
  {
    if (this._selectedWorkingDayIndex != value)
    {
      // this._selectedWorkingDayIndex = value;
      base.OnPropertyChanged("SelectedWorkingDayIndex");
    }
  }
}

Ich kann man mit diesem Code auch anderen Items auswählen.

09.06.2009 - 15:11 Uhr

Hallo winSharp93,

ja, ich verwende das MVVM-Pattern.

Im ViewModel habe ich die Property auch drin. Nein, damit ist es leider nicht getan. Das war auch mein erster Ansatz.
Selbst wenn ich zu Testzwecken folgende Zeile auskommentiere, kann ich fleißig beliebige Zeilen auswhählen:

this._selectedWorkingDayIndex = value;
09.06.2009 - 14:16 Uhr

Hallo,

ich habe eine Listbox mit Items, in der ich zur Laufzeit Eingaben tätige, die geprüft werden müssen. Wenn jetzt eine Prüfung fehlschlägt, möchte ich verhindern, dass ein anders ListBoxItem ausgewählt werden kann.

Hier die Eigenschaften meiner ListBox:

<ListBox x:Name="lstbxMonthDetails" Height="384px" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=MonthDetails}" Margin="0,1,0,0" SelectedIndex="{Binding Path=SelectedWorkingDayIndex}">

Meine Property "SelectedWorkingDayIndex":


public int SelectedWorkingDayIndex
{
  get { return this._selectedWorkingDayIndex; }
  set
  {
    if (this._selectedWorkingDayIndex != value)
    {
      this._selectedWorkingDayIndex = value;
      base.OnPropertyChanged("SelectedWorkingDayIndex");
    }
  }
}

Kann man das überhaupt abfangen?

Viele Grüße
Jens

08.06.2009 - 16:53 Uhr

Ok, dann nutze ich die Suche mal... 😉

Ich werde mich da mal in den nächsten Tagen ein wenig mehr mitbeschäftigen, und sonst weiß ich ja, wen ich fragen kann... 😉

Also, noch mal vielen Dank!!

Jens

08.06.2009 - 15:59 Uhr

Hallo winSharp93,

vielen Dank für den Link zu den FAQs.

Ich habe mir da jetzt mal etwas rausgesucht, was zumindest zum Test in einer Consolenanwendung super funktioniert. Ich baue das jetzt in Ruhe noch mal um.

Der zweite Weg hört sich gut an, momentan stehe ich aber etwas auf dem Schlauch und verstehe es noch nicht so ganz. Ich habe mich bisher auch noch nicht mit dem Thema "Dependency Injection" beschäftigt.
Kannst du mir hier evtl. auch noch den einen oder anderen Link nennen (außer google)?

Vielen Dank und viele Grüße!

Jens

08.06.2009 - 15:22 Uhr

Hallo winsharp93,

vielen Dank für deine beiden Antworten.

Hallo JKruse,

Zitat von JKruse:
Um das Layout meiner Anwendung steuern zu können, habe ich in meiner ViewModelBase-Klasse u.a. eine Eigenschaft mit dem Namen "Theme", die mir den aktuellen Wert in eine Konfigurationsdatei schreibt.

Wenn ich deine Absicht richtig verstehe: Du möchtest verschiedene Themes für deine Anwendung bereitstellen.
Das würde ich aber anders lösen: Speichere deine Styles, etc. als globale Resourcen und gib ihnen Namen in der Form [Window/ControlName].Control (oder wie auch immer). Wichtig ist nur, dass sie eindeutig sind.
Dann kannst du das Theme sehr angenehm wechseln, wenn du App.Resources ein anderes ResourceDictionary zuweist.

Ja, hast du richtig verstanden. Was die Theme-Steuerung angeht, habe ich mich an dem Codeplex-Beispiel WPF Themes orientiert. Ich schaue mir deinen Ansatz aber auch noch mal an.

Hallo JKruse,

Zitat von JKruse:
Ich habe in meiner MainWindowView einen Bereich, wo ich Fehlermeldungen anzeigen möchte, die in meiner Anwendung auftreten. In diesem Bereich möchte ich auch Fehlermeldungen anzeigen, wenn in einem anderen ViewModel Fehler auftreten.

Spontan sehe ich hier zwei Möglichkeiten:
•Der "direkte Weg": ConfigurationViewModel stellt ein Event bereit, das MainViewModel abboniert

•Der "indirekte Weg" über eine weitere Vermittlerklasse, der alle ViewModels ihre Fehler melden und die das MainViewModel irgendwie informiert.
Hier lassen sich auch einige "Spielereien" mit DepenedencyInjection usw. treiben.

Was mir hier noch nicht so klar ist, wie komme ich bei dem Event ("direkter Weg") an die Fehlermeldung? Bisher habe ich in meinem MainWindowViewModel eine Eigenschaft "ErrorDescription", die kann ich ja über das Event dann ansprechen.

Hast du evtl. für eine von beiden Wegen ("direkt" oder "indirekt") einen Lösungsansatz in Quellcodeform?

Viele Grüße
Jens

08.06.2009 - 08:05 Uhr

Guten Morgen,

ich muss den Thread noch mal zum Leben erwecken, weil ich noch eine Frage habe, die in die selbe Richtung geht. Bitte melden, falls es in einen neuen Thread soll.

Gehen wir mal nach wie vor von den beiden oben genannten Views aus (MainWindowViewModel und ConfigurationViewModel).
Ich habe in meiner MainWindowView einen Bereich, wo ich Fehlermeldungen anzeigen möchte, die in meiner Anwendung auftreten. In diesem Bereich möchte ich auch Fehlermeldungen anzeigen, wenn in einem anderen ViewModel Fehler auftreten.

Meine Frage jetzt, wie kann ich am einfachsten die Fehlermeldungen, die in meinen anderen ViewModels auftreten in mein MainWindowViewModel durchreichen?

Viele Grüße
Jens

02.06.2009 - 08:00 Uhr

Guten Morgen,

Über

new ConfiguratiopnViewModel()

erzeuge ich ja die neue Instanz.
Gibt es evtl. einen eleganteren Weg, ohne dass ich die Eigenschaft nochmal setzen muss?

Viele Grüße
Jens

01.06.2009 - 15:04 Uhr

Hallo,

ich habe mein Problem zwar hier (dotnet-gui.com) vor einiger Zeit schon mal gepostet, leider aber noch keine Lösung gefunden. Vielleicht könnt ihr mir weiterhelfen.

Um das Layout meiner Anwendung steuern zu können, habe ich in meiner ViewModelBase-Klasse u.a. eine Eigenschaft mit dem Namen "Theme", die mir den aktuellen Wert in eine Konfigurationsdatei schreibt.

Auszug:

public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable
{
  Configuration configuration = new Configuration();

  protected ViewModelBase()
  {
  }

  public virtual string Theme
  {
    get
    {
      return this.configuration.GetValue(Constants.Configuration.Theme);
    }
    set
    {
      if (this.configuration.GetValue(Constants.Configuration.Theme) != value)
      {
        this.configuration.SetValue(Constants.Configuration.Theme, value);
        this.OnPropertyChanged(Constants.ViewModelBase.ThemeProperty);
      }
    }
  }
}

In meiner ConfigurationView habe ich folgenden Code zum Ändern des Themes:

<ComboBox ItemsSource="{Binding Path=Themes, Mode=OneTime}" SelectedValue="{Binding Path=Theme, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ComboBox>

Die ItemsSource ist ein string[] mit den Namen der Themes.

Die Darstellung des Themes in den einzelnen Views erfolgt über folgende Zeile:

<UserControl x:Class="..." 
  themes:ThemeManager.Theme="{Binding Path=Theme}">
</UserControl>

Wenn ich einen anderen Theme aus der Liste auswähle, wird sofort das Layout des Dialogs geändert.

Wie kann ich jetzt aber erreichen, dass auch mein Hauptfenster geändert wird?
Auch mein Hauptfenster erbt von meiner ViewModelBase-Klasse, daher bin ich davon ausgegangen, dass mein Hauptfenster durch das OnPropertyChanged über den Wechsel des Themes informiert wird...

Der Aufruf des Dialogs (ConfigurationViewModel) erfolgt über folgenden Code:

void ShowConfiguration()
{
  try
  {
    this.ShowDialog(new ConfigurationViewModel());
  }
  catch (Exception e)
  {
    this.ErrorDescription = e.Message;
    this.ErrorImageSource = Constants.Exceptions.Type.Error;
  }
}

void ShowDialog(WorkspaceViewModel viewModel)
{
  Dialog dialog = new Dialog(viewModel);
  viewModel.Dialog = dialog;
  dialog.Title = viewModel.DisplayName;
  dialog.WindowStyle = WindowStyle.ToolWindow;
  dialog.ShowInTaskbar = false;
  dialog.Height = viewModel.ViewHeight + 24;
  dialog.Width = viewModel.ViewWidth + 6;
  dialog.ResizeMode = ResizeMode.NoResize;
  dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
  dialog.Topmost = true;
  dialog.ShowDialog();
}

Braucht ihr noch weiteren Quellcode?

Viele Grüße
Jens

22.05.2009 - 15:01 Uhr

Hallo Pioneer17,

wie wäre es beim FormClosing?

Viele Grüße
Jens

14.05.2009 - 15:54 Uhr

Hi,

du könntest mal testen, ob folgendes bei dir funktioniert:

<Label Content="{Binding Path=meineZahl}" ContentStringFormat="{}{0:f2}"></Label>

Dieses verwende ich in meinem Projekt.
Du müsstest für dich dann noch das f2 anpassen...

Viele Grüße
Jens

07.05.2009 - 12:05 Uhr

Hi,

die hier verwende ich in meinem Projekt...
WPF Themes

Download unter:
WPF Futures

Viele Grüße
Jens

06.05.2009 - 09:31 Uhr

Hallo Friedel,

danke schon mal für deine Antwort.

Ok, das ist natürlich richtig, dass ich dann Probleme habe(n könnte).
"Könnte", da es hauptsächlich um Pfadangaben geht, die ich in jedem Projekt speichern / auslesen müsste.

Ich werde aber den Punkt mit der separaten / eigenen Datei mal überdenken.

Viele Grüße
Jens

06.05.2009 - 08:57 Uhr

Guten Morgen,

ich habe ein Projekt, wo ich mehrere Assemblies erstelle (u.a. eine für den Datenzugriff). In meinem Hauptprojekt habe ich benutzerdefinierte Einstellungen, die in der app.config im Bereich userSettings gespeichert werden.

An dieser Stelle habe ich ein / zwei Probleme:

Und zwar möchte ich aus meiner Assembly, die für den DB-Zugriff zuständig ist, auf die Konfigurationsdatei zugreifen.
Das müsste ja eigentlich über den ConfigurationManager funktionieren, oder?
Wenn ja, wie kann ich denn dann in meiner Assembly auf userSettings zugreifen?
In meinem Hauptprojekt greife ich folgendermaßen auf die Werte zu:

Settings.Default.<Eigenschaft>

Ich möchte ungern mehrere .config-Dateien verwenden, und ich möchte, soweit es geht, die vorhandenen Funktionalitäten nutzen, ohne mir Hilfsklassen erstellen zu müssen...

Ich hoffe, ihr könnte mir weiterhelfen.

Viele Grüße
Jens

29.04.2009 - 08:27 Uhr

Hallo codeRocker,

wir bilden auch aus, und orientieren uns an dem Vergütungsvorschlag der für uns zuständigen Handelskammer.

Es ist natürlich auch davon abhängig, wie groß der Betrieb ist. Aus eigener Erfahrung weiß ich, dass du dort, wo es Tarfiverträge gibt, auch gerne 200 € über dem Vergütungsvorschlag liegen kannst.
Was im Umkehrschluss aber nicht heißen muss, dass dort die Ausbildung besser ist...

Viele Grüße

09.04.2009 - 14:52 Uhr

Hi,

bin auch gerade dabei mich in das Thema einzuarbeiten.
Ich habe bis jetzt gar nichts mehr im Codebehind meiner Views, was, zumindest habe ich es so verstanden, auch das Ziel vom MVVM ist.
Dein Löschen-Button gehört meiner Meinung in das ViewModel, und sollte auch da bleiben...

Warum lagerst du nicht deine BusinessLogik noch weiter aus?

Viele Grüße
Jens

28.01.2009 - 13:11 Uhr

Hallo,

ich habe noch mal eine (eher Anfänger-)Frage zu dem Thema.

Ich habe mir jetzt in einer neuen Situation ein Label erstellt (siehe Link von See Sharp). Von diesen Labels habe ich fünf in meinem Wpf-Fenster eingebaut.
Diese Labels erhalten manuell (ohne Databinding) Werte zugewiesen.
Momentan habe ich die Änderung der Schriftfarbe wie folgt im Codebehind des Fensters gelöst:

private void ChangeColor(object sender, DependencyPropertyChangedEventArgs e)
{
  JKLabel label = (JKLabel)sender;
  if (decimal.Parse(label.Content.ToString()) < 0)
  {
    label.Foreground = new SolidColorBrush(Konstanten.NegativerWert);
  }
  else
  {
    label.Foreground = new SolidColorBrush(Konstanten.PositiverWert);
  }
}

Kann ich diesen Teil auch in eine "Styles.xaml" auslagern, und per Trigger anstoßen (siehe Beitrag von winSharp93)?
Mich irritiert das Binding ein wenig.

Ich hoffe, ihr könnt mir nochmals helfen,

viele Grüße
Jens

08.01.2009 - 08:49 Uhr

verwendetes Datenbanksystem: XML-Datei

Hallo,

ich habe folgende XML-Struktur:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Arbeitszeiten>
  <Stunden>
    <Januar>
      <Tag>8,00</Tag>
      <Tag>12,50</Tag>
      <Tag>10,50</Tag>
      <Tag>11,50</Tag>
    </Januar>
  </Stunden>
</Arbeitszeiten>

Jetzt möchte ich per LINQ eine Summe über die Werte im <Tag></Tag> haben...
Wenn ich folgenden Weg nehme, erhalte ich nur den ersten Wert (8)...


IEnumerable<XElement> xElements = xDocument.Descendants("Stunden").Descendants(Konstanten.Januar).Descendants("Tag");
decimal januar = 0;
if (xElements.Count() > 0)
{
  var query = from xElement in xElements
                    group xElement by xElement into g 
                    select new 
                    {
                      Summe = g.Sum(xElement => decimal.Parse(xElement.Value)) 
                    };
  januar = query.First().Summe;
}

Kann mir bitte jemand sagen, wo mein Fehler ist, bzw. wie man es richtig macht?

Vielen Dank im Voraus!

Viele Grüße
Jens

03.01.2009 - 20:31 Uhr

Hallo See Sharp, hallo winSharp93,

vielen Dank für eure beiden Hinweise!

@winSharp93: Das ist genau das, was ich gesucht habe. Ich werde es mir jetzt mal etwas genauer anschauen. Vielen Dank!

Viele Grüße
Jens

03.01.2009 - 19:14 Uhr

Hallo zusammen,

gibt es einen Trigger, der auf das Ändern des Content bei einem Label reagiert?
Wenn ja, kann ich da auch den Wert prüfen?
Hintergrund ist, mein Label kann positive oder negative Zahlen darstellen. Jetzt möchte ich die Schriftfarbe je nach Wert (positiv oder negativ) ändern.

Ich habe bereits bei Google gesucht, war aber leider nicht erfolgreich. Ich habe immer nur die "Standard"-Trigger gefunden (IsMouseOver, etc.). Gibt es eine Übersicht, welche Trigger ich wo verwenden kann?

Viele Grüße
Jens

30.09.2008 - 11:53 Uhr

verwendetes Datenbanksystem: Sql Server 2008 Express

Moin,

ich stehe vor einem kleinen Problem.
Ich habe eine ASPX-Seite, die auf meine DB per Linq zugreift.
Ich kann jede Spalte meiner Tabelle auslesen.
Auch ein Einfügen klappt über Linq wunderbar.
Aber:
Eine Spalte in meiner Tabelle ist vom Typ XML (Linq: XElement).
Wenn ich versuche einen bestehenden DS zu aktualisieren, werden alle Spalten, bis auf diese (XML) aktualisert.

Kann mir jemand sagen, woran das liegen könnte?
Wenn ihr mehr Angaben braucht, bitte melden, was fehlt.

Viele Grüße
Jens

15.07.2008 - 07:54 Uhr

Guten Morgen Peter,

momentan hänge ich ein wenig beim DataBinding meines inneren Repeaters.
Kannst du mir zu deinem Hinweis:

Grundsätzlich kannst du aber bei der "DataSource" Eigenschaft deines inneren Repeaters jeweils ein DataBinding-Ausdruck des Äusseren geben.

evtl. ein Beispiel nennen, bzw. mir einen kurzen Denkanstoß geben, wie ich das realisieren könnte?

Viele Grüße
Jens

14.07.2008 - 15:46 Uhr

Hallo Peter,

vielen Dank für deine Hinweise.

Ich werde mich mal auf die Suche machen...

Vieel Grüße
Jens

14.07.2008 - 15:10 Uhr

Hallo Peter,

ja es funktioniert... 🙂

Aber es hat sich leider meine Anforderung ein wenig verändert.

Daher noch eine zusätzliche Frage:
Ich muss um meinen Repeater jetzt noch einen weiteren Repeater setzen.
Beide Repeater sind mit einer LinqDataSource verknüpft.
Kann ich bei der zweiten LDS Where-Parameter mit Daten aus der ersten LDS belegen?

Folgendes soll erreicht werden:

Repeater1.Gruppe
-- Repeater2.Eintrag
Repeater1.Gruppe
-- Repeater2.Eintrag
-- Repeater2.Eintrag
-- Repeater2.Eintrag
Repeater1.Gruppe
-- Repeater2.Eintrag

Mit dem ersten Repeater steuere ich jetzt die Gruppen.
Mit dem zweiten Repeater sollen die Einträge gesteuert, und den entsprechenden Gruppen zugewiesen werden.

Ist dies überhaupt möglich?

Viele Grüße
Jens

14.07.2008 - 12:35 Uhr

Hallo Peter,

ich werde mal probieren, ob es mit einem Repeater funktioniert.

Wie würdest du es Codeseitig machen?

Viele Grüße
Jens

14.07.2008 - 10:20 Uhr

Hallo zusammen,

ich stehe vor folgendem Problem:

Ich habe den folgenden Quellcode (Auszug):

<% 
      // LINQ-Abfrage
      // ...

      foreach (var item in query) 
      {
%>
        <div class="Zeile">
          <div class="Div1"></div>
          <div class="Div2"></div>
          <div class="Div3"></div>
          <div class="Div4">
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></div>
        </div>
<%
      } // foreach (var item in query) 
%>

In den Divs (1-3) werden Daten aus der Abfrage eingetragen.
In Div 4 benötige ich eine TextBox, die ich später auswerten kann.

Meine Frage nun, kann ich die ID irgendwie dynamisch erweitern, bzw. angeben, damit ich später auf die TextBox zugreifen kann?
Gibt es evtl. einen geeigneteren Weg?
Das Ganze habe ich in ein Web-UserControl eingebaut.

Viele Grüße
Jens

30.08.2007 - 17:58 Uhr

Hallo Peter,

danke für deinen Hinweis.

Ich habe bisher nur ein "Grob-Design".
Evtl. muss da noch weiterer Code hinterlegt werden.

Aber angenommen, ich würde nur den Link benötigen und das Ganze per anchor tag machen, wie bekomme ich es denn hin, dass die die GUID automatisch angepasst wird je nach selektiertem Wert aus der DropDownList?
Da wird doch etwas Aufwand dahinter stecken, oder täusche ich mich da?

Gruß
Jens

29.08.2007 - 20:28 Uhr

Hallo Peter,

super, V I E L E N D A N K!

Das mit dem href = "..." war die Lösung...

Viele Grüße
Jens

29.08.2007 - 19:23 Uhr

Hallo Peter,

hier die gerenderten Schnippsel:

<div class="ContentButtonItem">
            <input type="submit" name="ctl00$maincontent$btnShowSerie" value="Serie anzeigen" onclick="btnShowSerie_Click();" id="ctl00_maincontent_btnShowSerie" class="Button" />
          </div>
          <script language="javascript" type="text/javascript">
            function btnShowSerie_Click() {
              location.href("http://localhost/test/test.aspx?guid=5a468979-20a5-41f4-97ab-434b8e14a0c0");
            }
          </script>

Ich habe die Methode auch extra umbenannt...
Die GUID wird auch korrekt ausgelesen...

wenn ich das Ganze serverseitig über Response.Redirect() mach, funktioniert es auch...

Kann es sein, dass AJAX irgendwie Probleme mit diesem location hat?

Gruß
Jens

28.08.2007 - 17:43 Uhr

Nein, auch das funktioniert leider nicht...

Nein, Ich bekomme keine JavaScript-Fehler angezeigt. Am Control liegt es auch nicht, d das Ganze per window.open() einwandfrei funktioniert...

Hmm, dann werde ich das wohl serverseitig lösen müssen...

28.08.2007 - 06:20 Uhr

Hallo Peter,

vielen Dank für deinen Hinweis,
leider funktioniert das in meinem Fall nicht.
Es tut sich nach wie vor nichts...

Gruß
Jens

27.08.2007 - 21:27 Uhr

Hallo zusammen,

ich habe folgenden Source-Code geschrieben. Leider passiert nichts, wenn ich auf den Button klicke.

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" CodeFile="Default.aspx.cs" 
    Inherits="_Default" Title="Test"  Culture="auto" UICulture="auto" %>

<asp:Content ID="DefaultContent" ContentPlaceHolderID="maincontent" Runat="Server">
  <div id="Content">
    <ajax:ToolkitScriptManager ID="ToolkitScriptManager" runat="server"></ajax:ToolkitScriptManager>
    <ajax:UpdatePanel ID="UpdatePanel" runat="server">
      <ContentTemplate>
        <div class="ContentItems">
          <h1>Willkommen</h1>
          <div class="ContentDescriptionItem">
            <asp:thumbsup:bjectDataSource ID="ObjectDataSourceYearsOfPublication" runat="server" SelectMethod="GetAllYearsOfPublication" TypeName="BusinessLogicLayer.Serie"></asp:thumbsup:bjectDataSource>
            <asp:Label ID="lblSerienErscheinungsJahr" runat="server" Text="Erscheinungsjahr:" AssociatedControlID="ddlSerienErscheinungsJahr" CssClass="Label"></asp:Label>
          </div>
          <div class="ContentInputItem">
            <asp:DropDownList ID="ddlSerienErscheinungsJahr" runat="server" CssClass="DropDownList" AutoPostBack="True" DataSourceID="ObjectDataSourceYearsOfPublication" DataTextField="YearOfPublication" DataValueField="Guid"></asp:DropDownList>  
          </div>
          <div class="ContentButtonItem">
            <asp:Button ID="btnShowSerie" runat="server" Text="Serie anzeigen" OnClientClick="return Navigate();" CssClass="Button" />
          </div>
        </div>
      </ContentTemplate>
    </ajax:UpdatePanel>
  </div>
  <script language="javascript" type="text/javascript">
    function Navigate() {
      location.href("http://localhost/test/test.aspx?guid=<%=ddlSerienErscheinungsJahr.SelectedValue%>");
      return false;
    }  
  </script>
</asp:Content>

Kann mir jemand sagen, wo das Problem ist?

Wenn ich statt location.href() window.open() verwende, wird die Seite aufgerufen, allerdings in einem neuen Fenster, und das möchte ich verhindern...
Mein Ziel ist es die neue Seite in dem selben Fenster zu öffnen...

Macht AJAX hier Probleme?

Freue mich über eure Hilfe!!!

MfG
jens

01.07.2007 - 12:53 Uhr

Hallo zusammen,

ich bin auch auf der Suche nach einem WebHosting-Angebot.

Dieses sollte ASP.net 2.0 mit AJAX enthalten.

Hat von euch jemand Erfahrung damit und kann mir diesbezüglich einen WebHoster empfehlen?

Vielen Dank und viele Grüße
JKruse

27.06.2007 - 07:26 Uhr

Hallo AlfameisterT,

vielen Dank für deine Antwort.

Ich habe mein Panel jetzt in ein eigenes UpdatePanel gesetzt und damit funktioniert es auch.

Zum JavaScript:

Hast du ein oder mehrere Beispiel-Seiten, wo ich ein paar Infos darüber bekomme?
Ich könnte natürlich googlen, aber wenn du dich damit auskennst hast du vielleicht schon ein paar gute Seiten...

Viele Grüße
JKruse

26.06.2007 - 08:57 Uhr

Guten Morgen,

ich bin dabei eine Webanwendung zu entwickeln.
Auf einer Seite möchte ich gerne ein Panel verwenden und dieses bei bestimmten Aktionen ein- bzw. ausblenden.

Mit folgendem Code funktioniert es bei mir leider nicht.
Kann mir jemand weiterhelfen, wo der Fehler liegt?

ASPX-Seite:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" CodeFile="Test.aspx.cs"
    Inherits="Test_aspx" Title="" Culture="auto" UICulture="auto" Theme="Standard" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<asp:Content ID="Content1" ContentPlaceHolderID="maincontent" runat="Server">
  <div id="adminedit">
    <ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" />
    <fieldset>
      <h2 class="none">Test</h2>
        <legend>Test</legend>
        <asp:Panel ID="pnlTest" runat="server" Visible="false">
          <asp:Label ID="lblTest" runat="server" Text="Test" AssociatedControlID="txtTest"></asp:Label><br />
          <asp:TextBox ID="txtTest" runat="server"></asp:TextBox><br />
        </asp:Panel>
        <ajaxToolkit:TabContainer ID="TabContainer" runat="server" ActiveTabIndex="0">
          <ajaxToolkit:TabPanel ID="TabPanel1" runat="server" HeaderText="TabPanel1">
            <ContentTemplate>
              <asp:UpdatePanel id="UpdatePanelDefectInformation" runat="server">
                <contenttemplate>
                  <asp:Label id="lblName" runat="server" Text="Short Description:" __designer:wfdid="w67" AssociatedControlID="txtName"></asp:Label><br />
                  <asp:TextBox id="txtName" runat="server" Width="400px" __designer:wfdid="w68"></asp:TextBox><br />
                </contenttemplate>
              </asp:UpdatePanel>
            </ContentTemplate>
            <HeaderTemplate>Defect Information</HeaderTemplate>
          </ajaxToolkit:TabPanel>
        </ajaxToolkit:TabContainer>
        <asp:Table CellPadding="0" CellSpacing="0" ID="Table" runat="server">
          <asp:TableRow runat="server">
            <asp:TableCell runat="server">
              <asp:UpdateProgress id="UpdateProgress" runat="server">
                <progresstemplate>
                  <div class="progress"><img src="../Images/indicator_blue.gif" />&nbsp;Please Wait...</div>
                </progresstemplate>
              </asp:UpdateProgress>
            </asp:TableCell>
            <asp:TableCell runat="server">
              <asp:UpdatePanel id="UpdatePanelButtons" runat="server">
                <contenttemplate>
                  <asp:Button id="btnTest" onclick="btnTest_Click" runat="server" Text="Save" CausesValidation="True" CssClass="submit"></asp:Button>&nbsp;<asp:Button id="btnCancel" onclick="btnCancel_Click" runat="server" Text="Cancel" CausesValidation="False" CssClass="reset"></asp:Button> 
                </contenttemplate>
              </asp:UpdatePanel>
            </asp:TableCell>
          </asp:TableRow>
        </asp:Table>
    </fieldset>
  </div>
</asp:Content>

Code-Behind:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Collections.Generic;
using Test.BusinessLogicLayer;

public partial class Test_aspx : System.Web.UI.Page {
  public Test_aspx() {
  }

  void Page_Load(object sender, EventArgs e) {
  }

  protected void btnTest_Click(object sender, System.EventArgs e) {
    Test test = new Test();
    test.Name = this.txtName.Text;
    if (test.Save()) {
      this.pnlTest.visible = true;
    }
  }

  protected void btnCancel_Click(object sender, EventArgs args) {
    this.txtName.Text = string.Empty;
  }
}

Ich möchte gerne nach erfolgreichem Speichern eines Datensatzes, dass mir mein Panel angezeigt wird.
Die Methode Save() liefert mir true zurück, da der DS erfolgreich gespeichert wurde...

Vielen Dank im Voraus,

JKruse

16.05.2007 - 08:10 Uhr

Hallo Rene,

sorry, komme leider jetzt erst zum Antworten, da ich zuhause momentan kein Internet-Zugang habe... 🙁

Ich habe das mal probiert, funktioniert aber nicht, da auch diese Variante nur String-Werte zu lässt.

15.05.2007 - 09:38 Uhr

Guten Morgen,

in meiner ASP.net-Anwendung möchte ich auf Reports zugreifen und diese im ReportViewer-Control anzeigen lassen. Das ist mit Reports ohne Parameter kein Problem.

Ich habe allerdings momentan einen Report, der einen Parameter vom Typ Integer erwartet.
Problem dabei ist nur, dass die Methode ReportParameter(), die ich nutze um die Parameter zu übergeben nur String-Werte zu lässt.

Ich bekomme jetzt folgende Fehlermeldung:

Der Wert, der für den ProjectId-Berichtsparameter angegeben ist, ist für dessen Typ ungültig. (rsReportParameterTypeMismatch)

Den Parameter hole ich mir auch einer Textbox (txtProjectId.Text).
Ich habe sogar schon, nach ich das im Internet gefunden hatte, ein Convert.ToString() eingebaut - leider auch ohne Erfolg.

Hat jemand von euch so ein Problem schonmal gehabt und gelöst bekommen?
Bin über jede Hilfe dankbar!

MfG
JKruse

14.05.2007 - 10:19 Uhr

Hallo Peter,

vielen Dank für den Hinweis!

MfG
Jens

14.05.2007 - 09:45 Uhr

Hallo,

ich habe eine ASPX-Seite mit mehreren Eingabfeldern (TextBox) und drei Buttons (ein Image-Button, zwei "normale" Save und Cancel).

Da alle Felder Pflichtfelder sind, nutze ich das Validierungs-Control.

Beim "Submit"-Button (Save) wird auch die Validierung durchgeführt und die Felder auf Inhalt geprüft.

Allerdings möchte ich, dass diese Validierung nicht durchgeführt wird, wenn ich den Image-Button drücke.

Gibt es eine Möglichkeit dies zu steuern, und die Validerung beim Image-Button zu unterdrücken?

Vielen Dank im Voraus!

MfG
JKruse

07.05.2007 - 14:23 Uhr

Hallo,

ich bin dabei eine ASP.net Webanwendung zu entwickeln.
In der Anwendung möchte ich auf Reports zu greifen.

Jetzt stehe ich aber vor der Wahl:

Soll ich lokale Reports oder Server Reports verwenden?

Wozu tendiert ihr?

Kann mir jemand Vor- und Nachteile aufzeigen?

Vielen Dank im Voraus!

MfG
JKruse