C#/WPF/ Button mit einer Textbox verbinden. Bitte Helft mir.


x1xJanikx1x

Mitglied
Erstmal einen wunderschönen guten Tag,

ich soll im Rahmen meines Praktikums eine WPF-Anwendung machen die folgendes "kann".

Es soll ein Button sein und eine TextBox und immer wenn man auf den Button klickt soll in der
TextBox das Aktuelle Datum und die Uhrzeit angezeigt werden.

Als Befehle für das Datum und die Uhrzeit habe ich folgende genommen:
Code:
 DateTime now = DateTime.Now;
            string currentDate = now.ToLongDateString();
            string currentTime = now.ToLongTimeString();
Dieser Funktioniert in der Consolenausgabe auch problemlos.

Wie ich einen Button und eine TextBox erstelle habe ich bereit rausgefunden.

Bitte sagt mir jetzt wie ich die Aufgabe umsetzen kann.

LG Janik

P.S. Ich hoffe ich bin hier im Forum richtig ist nämlich mein erster Beitrag
 

Harrier

Erfahrenes Mitglied
http://msdn.microsoft.com/en-us/library/ms743596(v=vs.110).aspx
Hier wird erklärt, wie man auf einen Button-Klick reagiert.

Im Prinzip musst du deinem Button einen Event-Handler für das Click-Event hinzufügen. Dabei gibst du eine Methode an, die aufgerufen werden soll, wenn der Button geklickt wird. Per Code ginge das so:
myButton.Click += new RoutedEventHandler(myEventHandlerMethod);

Alternativ kannst du in WPF auch das Click-Attribut angeben. Beide Varianten werden in dem Beispiel demonstriert.

In dieser Event-Handler-Methode müsste dann bei dir eben sowas in der Art stehen:
myButton.Content = currentDate + " " + currentTime;

Viele Grüße,
Harrier
 

x1xJanikx1x

Mitglied
Hallo,
erst einmal danke für die schnelle Hilfe,
leider hat mich das bis jetzt nicht wirklich weiter gebracht.
Wenn ich den Code übernehme bekomme ich diese Fehlermeldung:

Code:
Fehler: Auf einen nicht statischen Member des äußeren Typs "Zeit_und_Datum_mir_WPF_Versuch_2.MainWindow" kann nicht über den geschachtelten Typ "Zeit_und_Datum_mir_WPF_Versuch_2.MainWindow.RoutedEventAddRemoveHandler" zugegriffen werden.
Ich hoffe ihr habt noch einen anderen Vorschlag bzw. eine Internetseite wo es noch ein bisschen besser erklärt ist.

LG Janik
 

x1xJanikx1x

Mitglied
Hallo, erstmal danke für die schnelle Antwort,
ich habe mein Code jetzt wieder komplett
gelöscht und bin immer noch nicht viel weiter.

Ich habe mittlerweile herausgefunden das ich das
ganze über die Binding Funktion machen muss.
Nun ist mir aber immer noch unklar wie ich diese Binding Befehle
verwende.

Könntest du mir eventuell sagen wie ich die TextBox mit dem Button verbinden kann
und den Button mit dem Befehl für die aktuelle Uhrzeit?

Danke schon mal im voraus.

LG Janik
 

Cromon

Premium-User
Hallo Janik

Du musst einfach das machen, was da oben steht. Im XAML machst du beim Button einen Handler für das Click-Event, der Designer erstellt den entsprechenden Funktionskörper und du kannst da dann einfügen, dass die Textbox den Inhalt der aktuellen Zeit bekommt.

Viele Grüsse
Cromon
 

x1xJanikx1x

Mitglied
Hallo Cromon,

entschuldige bitte meine "Dummheit".
Ich hatte den Text heute morgen komplett falsch interpretiert bzw. ihn unaufmerksam durchgelesen.
Ich werde jetzt mal versuchen alles umzusetzen und ggf. Fehlermeldungen und Programmcode
hier nochmal reinschreiben.

LG
Janik
 

x1xJanikx1x

Mitglied
Okay, ich habe den Code von oben weitgehend übernommen hab aber noch einige Fehlermeldungen.


Hier erst mal mein Code (ohne die Using...):
Code:
namespace WpfApplication1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow() {
  InitializeComponent();
        }
            
    public partial class RoutedEventAddRemoveHandler {
    void MakeButton(object sender, RoutedEventArgs e)
    {
  Button b2 = new Button();
  b2.Content = "New Button";

        b2.Click  += new RoutedEventHandler(Onb2Click);
        root.Children.Insert(root.Children.Count, b2);
        DockPanel.SetDock(b2, Dock.Top);
        text1.Text = "Now click the second button...";
        b1.IsEnabled = false;
    }

  DateTime now = DateTime.Now;
  string currentDate = now.ToLongDateString();
  string currentTime = now.ToLongTimeString();


}
}
}
und hier der Code von XAML:

Code:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Background>
        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
            <GradientStop Color="#FF606079" Offset="0" />
            <GradientStop Color="WhiteSmoke" Offset="1" />
        </LinearGradientBrush>
    </Window.Background>
        <StackPanel>
        <Button Name="b1" Height="38" Width="306">Aktuallisieren</Button>
        <TextBlock Name="text1" Height="179">Start by clicking the button below</TextBlock>
    </StackPanel>
    </Window>
Und hier die Liste von Fehlermeldungen :(

Code:
Auf einen nicht statischen Member des äußeren Typs "WpfApplication1.MainWindow" kann nicht über den geschachtelten Typ "WpfApplication1.MainWindow.RoutedEventAddRemoveHandler" zugegriffen werden.	

Auf einen nicht statischen Member des äußeren Typs "WpfApplication1.MainWindow" kann nicht über den geschachtelten Typ "WpfApplication1.MainWindow.RoutedEventAddRemoveHandler" zugegriffen werden.	

Der Name "Onb2Click" ist im aktuellen Kontext nicht vorhanden.	

Der Name "root" ist im aktuellen Kontext nicht vorhanden.	

Der Name "root" ist im aktuellen Kontext nicht vorhanden.	

Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "WpfApplication1.MainWindow.RoutedEventAddRemoveHandler.now" verweisen.	

Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "WpfApplication1.MainWindow.RoutedEventAddRemoveHandler.now" verweisen.

Bitte entschuldigt meine Fehler doch ich bin noch ein totaler Anfänger auf dem Gebiet, habe mich vorher nur mit HTML und Microkontroler Programmierung auseinander gesetzt.

Ich hoffe ihr könnt mir weiterhelfen.

LG Janik
 

Cromon

Premium-User
Hallo Janik

Also zuerst einige Fragen zur Klärung:
Warum plötzlich zwei Buttons? Anfänglich wolltest du doch einfach beim Klick auf nen Button in ner Textbox ein Datum anzeigen

Warum rückst du deinen Code nicht sauber ein? So ist das ganze doch gleich viel übersichtlicher:
C#:
namespace WpfApplication1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
	public partial class MainWindow : Window
	{
        	public MainWindow() 
        	{
        			InitializeComponent();
        	}
            
    		public partial class RoutedEventAddRemoveHandler 
        	{
    			void MakeButton(object sender, RoutedEventArgs e)
    			{
        			Button b2 = new Button();
        			b2.Content = "New Button";
 
        			b2.Click  += new RoutedEventHandler(Onb2Click);
        			root.Children.Insert(root.Children.Count, b2);
       				DockPanel.SetDock(b2, Dock.Top);
        			text1.Text = "Now click the second button...";
        			b1.IsEnabled = false;
    			}
 
    			DateTime now = DateTime.Now;
    			string currentDate = now.ToLongDateString();
    			string currentTime = now.ToLongTimeString();
        	}
	}
}
Nun siehst du auch, dass dein Datumscode irgendwo im Nirgendwo hängt einfach innerhalb der Klasse des Eventhandlers.

Du definierst zwar eine Command-Handler Klasse aber im XAML fügst du die nirgendwo als Handler hinzu.

Innerhalb einer Klasse kannst du nicht auf die Member einer Instanz der umgebenden Klasse zugreifen, dazu brauchst du eine Instanz dieser Klasse.

Schlussendlich musst du es auch gar nicht so kompliziert machen. Wie ich sagte: Geh einfach auf den Button, füge im XAML das Click-Event ein und der Designer erledigt den Rest, alles was du dann noch machen musst ist den Code für das Datum in die entsprechende Methode einfügen.

Viele Grüsse
Cromon
 
Zuletzt bearbeitet:

x1xJanikx1x

Mitglied
Hallo,

erst mal erneut ein großes Dankeschön.
ja du hast recht ich möchte auch nur einen Button machen, warum ich den Code nicht sauber eingerückt habe weiß ich selber nicht genau. Was muss ich denn bei XAML als Handler eintragen und was meinst du mit "Der Designer erledigt den Rest".

Meine "Codes" sehen jetzt so aus:

Code:
namespace WpfApplication1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
            public MainWindow() 
            {

                    InitializeComponent();
                        DateTime now = DateTime.Now;
                        string currentDate = now.ToLongDateString();
                        string currentTime = now.ToLongTimeString();
}
            
                            public partial class RoutedEventAddRemoveHandler 
                            {
                            void ZeitDatum(object sender, RoutedEventArgs e)
und so:

Code:
<StackPanel>
        <Button Name="b1" Click="ZeitDatum" Height="38" Width="306">Aktuallisieren</Button>
        <TextBlock Name="text1" Height="179">Start by clicking the button below</TextBlock>
</StackPanel>
Ist es jetzt bis hierhin richtig und wie muss ich jetzt weiter machen.

Danke nochmal das du dich mit so einem "inkompetenten Fall" wie mir beschäftigst!
LG
Janik
 

Cromon

Premium-User
Hallo Janik

Woher kommt diese Klasse RoutedEventAddRemoveHandler? Die sollte da nicht sein. Am einfachsten machst du nochmals ein neues sauberes Projekt, legst einen Button und eine Textbox auf das Fenster und lässt den Designer beim Click-Event die Funktion generieren (wenn du im XAML Click= eingibst erhälst du bereits den Vorschlag dafür). Dann kannst du da deinen Code einfügen und fertig.

Viele Grüsse
Cromon
 

x1xJanikx1x

Mitglied
Hallo,

bevor ich jetzt irgendetwas Falsch mache frage ich noch einmal:

Ich hab jetzt folgenden XAML Code :
Code:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Background>
        <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
            <GradientStop Color="#FF606079" Offset="0" />
            <GradientStop Color="WhiteSmoke" Offset="1" />
        </LinearGradientBrush>
    </Window.Background>
    <Grid>
        <Button Name="Button1" Click="Button_Click" Margin="117,32,141,234">Aktualisieren</Button>
        <TextBox Height="101" VerticalAlignment="Top" Margin="0,112,0,0"></TextBox>
        
    </Grid>
</Window>
Und diesen Code im Programm:

Code:
namespace WpfApplication1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {

        }
    }
}
Kannst du mir jetzt sagen WO ich den "ZeitDatum" Code einfügen muss?

Code:
DateTime now = DateTime.Now;
            string currentDate = now.ToLongDateString();
            string currentTime = now.ToLongTimeString();
Und irgendwoher muss die TextBox ja auch wissen woher die Daten kommen oder nicht?

Danke nochmal für die Hilfe :)

LG
Janik
 
Zuletzt bearbeitet:

Cromon

Premium-User
Hallo Janik

Wenn du etwas machen willst wenn der Button gedrückt wurde musst du den Code in die Funktion schreiben, die aufgerufen wird, wenn der Button gedrückt wurde. Du hast im XAML drin:
XML:
<Button Name="Button1" Click="Button_Click" Margin="117,32,141,234">Aktualisieren</Button>
Es wird also die Funktion Button_Click aufgerufen und da musst du nun der Textbox den Text zuweisen.

Viele Grüsse
Cromon
 
Zuletzt bearbeitet von einem Moderator:

x1xJanikx1x

Mitglied
Hallo Cromon,

das ist ja mein Problem.
Ich weiß nicht wie ich das mache.

Ich würde mich freuen wenn du mir sagst mit welchem Befehl und wie ich das mache.

LG
Janik
 

x1xJanikx1x

Mitglied
Hallo Cromon,

vielen vielen Dank für deine Hilfe und vor allem für deine Geduld mit mir!
Es klappt jetzt alles genauso wie es soll!

LG
Janik