tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
30
ZUGRIFFE
1039
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    Also ich bin erst nur Anfänger im programmieren mit C# aber ich wollt mal fragen wie man die ganze Zeit überprüft ob eine Variable gesetzt wird. Wenn die Variable dann gesetzt wird soll dann eine Aktion stattfinden. Ich glaub, dass das eig ganz einfach is aber ich hab kp wie man das machen soll
     

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    Die einzige Möglichkeit sowas zu implementieren ist glaub ich sich selbst ein Event zu schreiben und dieses z.B.: im Setter der Variable aufzurufen. Die Aktion die du ausführen möchtest kannst du dann in einem EventHandler implementieren.

    Aber erzähl mal kurz was du vor hast, vielleicht kann man dann das Problem überhaupt von einer anderern Seite angehen.
     

  3. #3
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    mit dem Event versteh ich schonmal garnoichts aber egal
    Also... ich habe 2 Windows Form anwendungen, wenn dann bei der 2 form auf einen knopf gedrückt wird soll dann bei der ersten form eine variable angehen. wenn diese variable dann an ist soll dann bei form 1 eine aktion ablaufen

    vieleicht kann man ja machen dass machen dass wenn man auf den knopf drückt direkt die aktion in der anderen form abläuft und die variable dann garnicht nötig ist

    ich hoffe du hast halbwegs verstanden was ich meine
     

  4. #4
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Na wenn das so ist:

    Du kannst den Button auf Form2 als public definieren, dann kannst du dir in der Form1 einen EventHandler für das ClickEvent registrieren und dann dort die Aktion ausführen.
    Du solltest dir aber schon ein bisschen was über Events anschauen, sonst wirst du mit WinForms noch ziemlich Probleme kriegen.
     

  5. #5
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    erstmal danke für die antworten
    weißt du zufällig wo man sich gut darüber informieren kann?
     

  6. #6
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Mit welchen Unterlagen hast du denn bis jetzt C# gelernt? DAS Nachschlagewerk für .Net ist auf jeden Fall die MSDN Library.
    Bei Büchern und so hab ich auch keine Ahnung was momentan aktuell und gut ist.
     

  7. #7
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    kann man nicht einfach das machen?

    public void Form2.button1_Click(object sender, EventArgs e)
     

  8. #8
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    public void Form2.button1_Click(object sender, EventArgs e)
    wo würdest du das hinschreiben? bzw. wo registrierst du dir den EventHandler "button1_Click"? Einfach nur eine Funktion hinzuschreiben reicht nicht, man muss auch irgendwo noch das Click-Event mit der Funktion verknüpfen.
     

  9. #9
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    also dass man dann in form 1 eingibst:


    public void Form2.button1_Click(object sender, EventArgs e)
    {
    //Anweisungen
    }

    oder geht das nicht?
     

  10. #10
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Nein, das geht nicht. Die einzige Lösung die funktionert ist die von mir schon oben beschriebene: In der Form2 den Button-Modifier auf public setzen und dann in der Form1.cs irgendsowas bauen:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    public partial class Form1 : Form
        {
            Form2 form2;
     
            public Form1()
            {
                InitializeComponent();
     
                form2 = new Form2();
                //Eventhandler an das Click-Event binden
                form2.button1.Click += new EventHandler(button1_Click);
            }
     
            // EventHandler
            void button1_Click(object sender, EventArgs e)
            {
                //Hier der Code der beim Clicken auf den Button ausgeführt werden soll
            }
        }
     

  11. #11
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi!

    Gleich mal vorweg: Als Lektüre kann man sicher das aktuelle OpenBook von Galileo empfehlen. Visual C# 2010.

    Nun zum Problem:
    Also den Button gleich public zu setzen, würd ich vermeiden.. Da gibts sicher interessantere Arten dies zu lösen..

    Hier mal eine Variante, die man auch als Anfänger recht schnell verstehen können sollte..

    Das Feld in Form1 ist auf privat gesetzt, Zugriff erfolgt über eine öffentliche Eigenschaft. Im Set-Teil der Eigenschaft wird überprüft ob der neue Wert sich vom Alten unterscheidet. Wenn der neue Wert wirklich neu ist, wird dieser auf das private Feld gesetzt und eine Methode aufgerufen. Ist der neue Wert gleich, wird nichts gemacht weil sich ja nichts ändert.

    In der aufgerufenen Methode kann dann jede beliebige Aktion durchgeführt werden, die wann immer sich die Variable ändert auch ausgeführt werden soll. Dabei ists ganz egal wer den Wert ändert.

    In Form2 brauchts jetzt nur eine Möglichkeit die Variable in Form1 zu setzen. Dazu übergeben wir einfach einen Verweis auf Form1 im Konstruktor. Da Form2 ziemlich sicher erst nach Form1 erstellt wird, sollte das ja Problemlos möglich sein.

    Nachfolgend kurz ein bischen Code wir das ungefähr aussieht. Es ist halt ein Ansatz von der anderen Seite, im Vergleich zum Vorgehen von Steiner_B. - klingt aber eher nach der richtigen Lösung zu "wie man die ganze Zeit überprüft ob eine Variable gesetzt wird. Wenn die Variable dann gesetzt wird soll dann eine Aktion stattfinden."

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    public class Form1 : Form
    {
        private bool myVariable = false;
        
        public bool MyVariable
        {
            get { reutrn myVariable; }
            set
            {
                if (myVariable == value)
                    return; // die variable würde sich nicht ändern, also keine benachrichtigung
                    
                myVariable = value;
                MyVariableChanged();
            }
        }
     
        private void MyVariableChanged()
        {
            // hier deine Aktion ausführen..
        }
     
    }
     
    public class Form2 : Form
    {
        private Form1 form1;
        
        public Form2(Form1 form)
        {
            this.form1 = form;
            //.. Form2 hat button1
        }
        
        private void button1_Click(object sender, EventArgs ea)
        {
            form1.MyVariable = true;
        }
    }

    Noch ein Hinweis: Du solltest gleich von Anfang an beginnen deinen Variablen sinnvolle Namen zu geben. "Form1", "Form2", etc. sagen ja überhaupt nichts aus.

    Grüße,
    Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  12. #12
    19bluedragon99 19bluedragon99 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    14
    Danke erstmal nochmal verstanden hab ich es auch aber wenn ich auf den knopf bei form2 drück stürztz das programm ab und diese fehlermeldung bei:
    public class Form2 : Form
    {
    private Form1 form1;

    public Form2(Form1 form)
    {
    this.form1 = form;
    //.. Form2 hat button1
    }

    private void button1_Click(object sender, EventArgs ea)
    {
    form1.MyVariable = true;
    }
    }

    "NullReferenceException wurde nicht behandelt.
    Der Objektsverweis wurde nicht auf eine Objektinstanz festgelegt."
     

  13. #13
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Dann hast du wahrscheinlich vergessen den Verweis auf deine Form zu setzen. (So wie ichs im Kontruktor des Beispiels gezeigt habe.)
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  14. #14
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Hallo,

    @Alexander Schuc: Vom Verständnis her ist deine Lösung sicher die bessere Variante, ich würde nur im Sinne der Wiederverwendbarkeit bzw. Code-Wartbarkeit davon absehen solche Lösungen zu bauen, da du jetzt auch jedes Mal den Coder der "Form2" verändern musst wenn du diese noch an einer anderen Stelle nutzen möchtest. Auch im Bezug auf Thread-Sicherheit sollte man eher Events als Setter verwenden, da (hier im Beispiel) der EventHandler im Thread der Form1 ausgeführt wird, aber der Setter im Thread von Form2 laufen würde.
    Die meiner Meinung nach beste Lösung ist, wie schon im ersten Post beschrieben, sich selbst ein Event in der Form2 zu schreiben, welches dann vom button_click ausgelöst wird.
     

  15. #15
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hoi..

    Ob Form2 wirklich einen eigenen UI Thread haben wird? Wäre mir wirklich neu, dass das als "gute Idee" durchgeht. Aber hey, ich machte ne Weile nichts mit WinForms..

    Inwiefern ist denn das Event besser als der Setter, im Sinne der Threadsicherheit?
    Das Event wechselt ja auch nicht gnädigerweise für jeden EventHandler der dranhängt in den "richtigen" Thread. Das muss man dann schon noch selber machen..

    Den Button in Form2 öffentlich zu machen ist dann aber auch nicht wirklich ne tolle Idee.. aber Wiederverwendbarkeit/Code-Wartbarkeit ist hier in dem Thread glaub ich noch kein Thema. Natürlich sollte man so früh wie möglich nach Best-Practices arbeiten.. aber das dürfte einen Anfänger ziemlich schnell frusten..

    Mein Code macht übrigens schon mal die erste Hälfte von dem was du in deinem ersten Beitrag beschrieben hast.
    glaub ich sich selbst ein Event zu schreiben und dieses z.B.: im Setter der Variable aufzurufen. Die Aktion die du ausführen möchtest kannst du dann in einem EventHandler implementieren.
    MyVariableChanged wäre der richtige Ort um ein Event abzufeuern. (Schickerweise sollte man die Methode dann aber z.b. OnMyVariableChanged nennen,..)


    Ein schlichtes "Alex" reicht übrigens als Anrede..

    lg
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

Ähnliche Themen

  1. SESSION-Variable per AJAX gesetzt, bei Seitenreload leer
    Von Noeden im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 30.06.11, 20:53
  2. Compiler-Warnung wenn Variable nicht gesetzt wird
    Von XtremeCJ im Forum .NET Application und Service Design
    Antworten: 3
    Letzter Beitrag: 26.07.09, 16:01
  3. Antworten: 2
    Letzter Beitrag: 18.12.07, 10:39
  4. Antworten: 4
    Letzter Beitrag: 28.08.06, 16:07
  5. Pruefen ob Variable gesetzt ist (=isset)
    Von rainerdam im Forum .NET Archiv
    Antworten: 6
    Letzter Beitrag: 05.10.04, 11:32