Frage zu Referenzen.



  • Hallo! Ich habe eine Variable

    String S;
    

    und Eine TextBox

    TextBox T=new TextBox();
    

    Nun möche ich, dass der Text der TextBox sich "automatisch" ändert wenn S geändert wird. Kann ich irgendwie (hoffentlich formuliere ich richtig) T.Text auf S zeigen lassen?



  • Nein oder sollte man nicht benutzen. Es bringt nichts wenn der Text dadurch geändert wird, weil ein anderer String auf die gleichen Daten im Speicher zeigt und ändert. Von den Änderungen wird die TextBox nichts erfahren.
    Für eine Änderung muss TextBox.Text._set() explizit aufgerufen werden.

    Also, die nächste naheliegende Möglichkeit ist es eine Property String zu definieren und in den Getter und Setter auf die TextBox verweisen. So bewirgt jede Änderung auch eine Änderung an der Textbox.



  • Außerdem sind Strings unter .NET immuteable, sprich sie können nicht geändert werden nachdem sie angelegt wurden. Eine Veränderung eines Strings erzeugt tatsächlich immer ein neues String-Objekt.

    Ein "Zeiger" auf S würde also nix bringen weil das Objekt S sich nie verändert.



  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace GenTestWinform {
      public partial class Form1 : Form, INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
    
        private string p_Test = "hallo";
    
        public string Test { get { return p_Test; } set { p_Test = value; OnPropertyChanged( "Test" ); } }
    
        public Form1() {
          InitializeComponent();
    
          TextBox_Test.DataBindings.Add( new Binding( "Text", this, "Test" ) );
        }
    
        private void button1_Click( object sender, EventArgs e ) {
          Label_Test.Text = p_Test;
        }
    
        private void button2_Click( object sender, EventArgs e ) {
          Test = "Ääääätsch";
        }
    
        private void OnPropertyChanged( string propName ) {
          PropertyChangedEventHandler tmp = PropertyChanged;
    
          if( tmp != null ) {
            tmp( this, new PropertyChangedEventArgs( propName ) );
          }
        }
      }
    }
    

    So könnte das ganze dann mit Data-Binding aussehen... Im Prinzip das, was Rhombicosidings vorgeschlagen hat, nur mit dem feinen Unterschied, dass die Property nicht weiß/wissen muss, an wen sie alles gebunden ist.



  • Danke SolidOffline!
    Ich werde es morgen ausprobieren.
    Was mich aber ärgert, sind diese geschweifte klammern.
    Und zwar finde ich dieses übersichtlicher:

    funktion()
    {
    //blub
    }
    

    als das:

    funktion(){
    //blub
    }
    

    warum macht man das so?



  • Um eine Zeile zu sparen 😉

    Weil die IDE das so automatisch erstellt, weil man es so möchte, weil es der Arbeitegeber / Leherer / Professor / Code Guidelines so vorschreibt ... .

    Wenn ich mich richtig erinnere hatten wir diese Frage schon einmal vor einiger Zeit (irgendwo im Forum).



  • reden wir von forms oder wpf ?
    wenn bei wpf kann man der textbos ja problemlos ein binding zum string geben



  • neoexpert schrieb:

    warum macht man das so?

    Ein Überbleibsel aus der Zeit als Computerdisplays noch maximal 40 Text-Zeilen hatten und jede Zeile kostbar war...


Anmelden zum Antworten