Kein Zugriff auf Control, was tun?



  • Hi leute,

    ich bin mit meinen fähigkeiten nach knapp einem Jahr programmier Pause etwas eingerostet, alles in allem kann ich es noch aber das folgende simple Problem konnte ich nicht lösen.

    Ich entferne alle Controls aus einem Fenster und erzeuge dann neue für dieses Fenster mit folgender Funktion (ich poste hier der Übersichtlichkeit wegen nur die relevanten Controls):

    public void NewControls1()
            {
                Font FontA = new System.Drawing.Font("Microsoft Sans Serif", 12, FontStyle.Regular);
                Font FontB = new System.Drawing.Font("Microsoft Sans Serif", 16, FontStyle.Italic);
    
                ListBox LB2 = new ListBox();
                LB2.Bounds = new Rectangle(new Point(27, 109), new Size(212, 275));
                LB2.ItemHeight = 15;
                LB2.ScrollAlwaysVisible = true;
    
                TextBox TB1 = new TextBox();
                TB1.Bounds = new Rectangle(new Point(27, 69), new Size(212, 20));
                TB1.Font = FontA;
                TB1.KeyPress += new KeyPressEventHandler(TB1_KeyPress);
    }
    

    soweit so gut, nun muss ich aber per KeyPressEvent die Daten aus der Textbox auslesen und in die LB2 Adden... Würde ich Zugriff auf LB2 kriegen wäre das Adden in die Listbox ja kein Problem für mich aber ich habe keinen Zugriff auf die ListBox "LB2" . Hier mein Ansatz

    private void TB1_KeyPress(object sender, KeyPressEventArgs e)
            {
    
                if (e.KeyChar == (char)Keys.Enter)
                {
    
                    string addT = sender.ToString().Replace("System.Windows.Forms.TextBox, Text:", "");
    
    LB2.Items.Add(addT);
    
                }
    
            }
    

  • Administrator

    Du musst deinem Eventhandler irgendwie die Referenz zur Listbox mitteilen. Wenn alles in derselben Klasse geschieht, dann erstell doch einfach eine Membervariable für die Listbox.

    Im übrigen, wieso entfernst du alle Controls und erstellst sie neu?

    Grüssli



  • Hallo pBx,

    du könntest bei der TextBox die Eigenschaft 'Tag' defür benutzen, d.h.

    TB1.Tag = LB2; // ich hoffe mal, in deinem echten Programm hast du bessere Namen dafür gewählt ;-)
    

    Und in der Ereignismethode (event handler) kannst du dann darauf zugreifen:

    TextBox tb = sender as TextBox;
    if(tb != null)
    {
        ListBox lb = tb.Tag as ListBox;
        if (lb != null)
        {
            lb.Items.Add(...);
        }
    }
    

    Und noch etwas:

    pBx schrieb:

    sender.ToString().Replace("System.Windows.Forms.TextBox, Text:", "");

    Dies ist die umständlichste Art, um an den Text zu kommen!!!
    Also so wie oben entsprechend den 'sender' 'casten' und dann einfach:

    string text = tb.Text;
    


  • Danke für eure Hilfe, muss wohl doch wieder ein paar Dinge auffrischen.

    Übrigens, doch die Variablen sind so auch im echten Programm genannt aber das hier ist eigl. nur ne Quick&Dirty Solution damit ich wieder ins Programmieren rein komme und kein Programm das ich veröffentlichen wollte.

    Die Controls habe ich entfernt und neue hinzugefügt weil ich keine neue Form erstellen wollte...



  • Hi leute ich habe noch eine kleine Frage, wieso kann ich nicht mehrere Controls Taggen? Und wie löse ich dieses Problem am elegantesten? Im Augenblick habe ich immer nur Zugriff auf die Control welche als letztes getaggt wurde.

    Edit:

    Übrigens, hier mal der Code:

    Button BNSession = new Button();
                BNSession.Bounds = new Rectangle(new Point(256, 221), new Size(193, 44));
                BNSession.Text = "New Session";
                BNSession.Font = FontA;
                BNSession.Tag = LB2;
                BNSession.Tag = TB1;
                BNSession.Tag = BCheck;
                BNSession.Click += new EventHandler(BNSession_Click);
    
    private void BNSession_Click(object sender, EventArgs e) // New Session Button
            {
                Button BNewSession = sender as Button;
                Button BCheck = BNewSession.Tag as Button;                       
                ListBox LB2 = BNewSession.Tag as ListBox;
                TextBox TB1 = BNewSession.Tag as TextBox;
    }
    /*der Rest vom Code führt befehle für BCheck,LB2 und TB1 durch aber es wird immer nur die zuletzt Getaggte Control benutzt (in diesem Beispiel BCheck)*/
    

  • Administrator

    Tag ist ein Property, welches im Hintergrund eine Membervariable des Controls darstellt. Einer Variable kann man nur einen Wert zuweisen und nicht mehrere.

    BNSession.Tag = LB2;    // BNSession.Tag referenziert LB2
    BNSession.Tag = TB1;    // BNSession.Tag referenziert TB1 und nicht mehr LB2
    BNSession.Tag = BCheck; // BNSession.Tag referenziert BCheck und nicht mehr TB1
    

    Wie ich schon oben gesagt hatte, nimm dazu Membervariablen in deiner Klasse.

    Aber mal ehrlich, auch mit einer Pause von einem Jahr, das sind absolute Grundlagen, welche man nicht einfach so verlernt. Ich habe etwas Mühe zu glauben, dass du dies vor einem Jahr gekonnt haben sollst und nun plötzlich nicht mehr. Daher empfehle ich dir, dass du besser mal ein Buch durchlesen solltest. Oder mach doch zumindest mal den C# Programming Guide von der MSDN durch:
    http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx

    Grüssli



  • Ach das mit dem Vergessen geht schon vorallem wenn mans damals auch noch nicht vollkommen gelernt hatte. Ich weiss eh sehr wenig was C# angeht kann aber ein paar Dinge... Worauf ich hinaus will ist Wissen != Können und ich konnte mal bissl was aber mein Wissen war immer sehr beschränkt.

    Ich komme mit Programmierbüchern eigl. nur bedingt klar... am besten lerne ich durch Üben => das Schreiben von Programmen z.B. hat mir der Hinweis auf Tags schon weitergeholfen und ich habe etwas neues gelernt. Naja, ich versuche euch einfach so wenig wie möglich mit unwichtigen Fragen zu nerven dennoch Danke für eure Geduld denn ganz ohne meine Anfänger Fragen wirds wohl nicht gehen 🙂 .

    Nochmals vielen Dank für die Antwort&Hilfe,

    MfG, µBx


  • Administrator

    µBx schrieb:

    Ich komme mit Programmierbüchern eigl. nur bedingt klar... am besten lerne ich durch Üben => das Schreiben von Programmen...

    Das trifft auf jeden zu, dass man erst durch Üben etwas wirklich beherrschen kann. Nur ist das so gut wie unmöglich, wenn du gar keine Theorie dazu hast. Dann verirrst du dich nur in der Gegend und wirst nie wissen, wie es wirklich richtig geht.
    Der C# Programming Guide ist nicht gross und sehr leichtgewichtig, würde dir aber schon unglaublich gutun. Du könntest das Teil in ein paar Tagen durchlesen mit grossen Pausen dazwischen. Das schafft wirklich jeder.

    µBx schrieb:

    ... z.B. hat mir der Hinweis auf Tags schon weitergeholfen und ich habe etwas neues gelernt.

    Ist meiner Meinung nach genau ein Fall, wo es sich zeigt, dass es dir gar nicht weitergeholfen hat. Durch dein beschränktes Wissen, hast du die Nutzung von Tag völlig falsch verstanden. Tag soll nur dazu da sein, um einzelne Dinge an ein Control zu binden, welche explizit dazu gehören. Es ist eine Art von sehr enger Bindung, welche man hier setzen kann. Für dich wären wie gesagt Membervariablen deutlich sinnvoller. Aber anscheinend kennst du diese Möglichkeit nicht einmal, weil du die grundlegende Theorie gar nicht kennst.

    Ohne Grundlagen wirst du ewig im Kreis laufen und wenn du dann wieder mal ein Jahr nichts machst, dann fängst du wieder von vorne an. Nicht gerade ein sehr effizienter Weg.

    µBx schrieb:

    Naja, ich versuche euch einfach so wenig wie möglich mit unwichtigen Fragen zu nerven dennoch Danke für eure Geduld denn ganz ohne meine Anfänger Fragen wirds wohl nicht gehen

    Wir stehen hier sehr gerne für Fragen bei Unklarheiten zur Verfügung. Ich persönlich, und ich meine eigentlich, dass ich damit nicht alleine dastehe, bin der Meinung, dass man von einem Anfänger erwarten darf, dass er auch etwas Eigeninitiative zeigt und probiert zumindest die Grundlagen zu lernen.

    Grüssli



  • So ich habe meine Hausaufgaben gemacht und mich mal wieder eingelesen etc aber ich habe noch nicht ganz verstanden wie ich einer Membervariable z.B. eine Listbox referenzieren soll ... Membervariablen so benutzen, ok ... kann ich mittlerweile aber das referenzieren einer Control an die Membervariable? könnte mir da jmd einen nützlichen Link zu kommen lassen oder mir ein kleines Beispiel geben? Habe per Google nicht so richtig was dazu gefunden.

    MfG, µBx



  • Erstelle dir eine lokale Klasse, welche die entsprechenden Member hat:

    class MyTagControls
    {
      public TextBox MyTextBox { get; set; }
      public ListBox MyListBox { get; set; }
      public Button MyButton { get; set; }
    }
    

    Nun erzeugst du jeweils ein Objekt dieser Klasse, setzt die Eigenschaften und übergibst dann dieses Objekt der Tag-Eigenschaft.

    Beim Auslesen der Tag-Eigenschaft, mußt du dann nur entsprechend casten:

    MyTagControls myTagControls = BNSession.Tag as MyTagControls;
    if (myTagControls != null) // überprüft, ob auch wirklich ein MyTagControls-Objekt dahintersteckt
    {
      // ...
    }
    


  • Danke für deine Hilfe, der Hinweis auf die Membervariablen hat mir schon sehr geholfen gehabt aber auch nach dem ich die verstanden hatte war mir das mit dem Referenzieren auf Controls/Typen noch nciht ganz klar. So leuchtet es aber ein 🙂

    Vielen Dank.

    MfG, µBx


Log in to reply