none
UserControl RRS feed

  • Frage

  • Hi,

    ich habe in meiner Winform Anwendung ein usercontrol erstellt und dem Formular hinzugefügt.

    Nun hätte ich gerne eine Methode, die auch im Formular sichtbar ist.
    Ich bitte um Unterstützung - Danke !

    Donnerstag, 4. Februar 2021 01:54

Antworten

  • Hi,
    schau dir mal die folgende kleine Demo an. Das UserControl hat eine öffentliche Eigenschaft (im Beispiel SetColor), die im Hauptfenster aufgerufen wird. Für den Aufruf ist der Verweis auf das UserControl erforderlich. In der Demo wird die Instanz des UserControls per eigenem Code erzeugt und damit steht dann auch die Verweisvariable zur Verfügung. Wenn das UserControl mit dem Designer auf das Formular gezogen wird, wird der Code zur Erzeugung der Instanz in der Designer-Datei abgelegt. Der Name des UserControls ist gleichzeitig auch der NAme der Verweisvariable, die dann im Code das Hauptfensters genutzt werden kann.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        // Instanz des UserControls
        private UserControl1 uc = new UserControl1() { Top=50, Left=50 };
    
        private Button btn = new Button() { Text = "Call method in UserControl", Dock = DockStyle.Top };
    
        private void Form25_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { btn,uc }); // simulate designer
          this.btn.Click += Btn_Click;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          uc.SetColor();  // Methode aufrufen
        }
    
        public class UserControl1 : UserControl
        {
          private Random rnd = new Random();
          public UserControl1() // constructor
          {
            this.BackColor = Color.Lime;
          }
    
          /// <summary>
          /// öffentliche von außen zugängliche Methode
          /// </summary>
          public void SetColor()
          {
            this.BackColor = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256));
          }
        }
      }
    }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 4. Februar 2021 04:53
  • Hi,
    natürlich geht das auch in C#.

    Im Control wird zur Ausführungszeit eine Methode gestartet (entweder beim Laden oder durch Bedieneraktivität) und diese Methode wartet dann auf eine Antwort vom Gerät, üblicherweise nach einem Abschicken einer Anforderung an das Gerät.

    Wenn dann die Daten eintreffen, müssen diese aufbereitet werden (z.B. Bytes in Zeichenkette) und dann in den Thread des Oberflächenelementes zur Anzeige "umgeleitet" werden.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 4. Februar 2021 16:51

Alle Antworten

  • Hi,
    schau dir mal die folgende kleine Demo an. Das UserControl hat eine öffentliche Eigenschaft (im Beispiel SetColor), die im Hauptfenster aufgerufen wird. Für den Aufruf ist der Verweis auf das UserControl erforderlich. In der Demo wird die Instanz des UserControls per eigenem Code erzeugt und damit steht dann auch die Verweisvariable zur Verfügung. Wenn das UserControl mit dem Designer auf das Formular gezogen wird, wird der Code zur Erzeugung der Instanz in der Designer-Datei abgelegt. Der Name des UserControls ist gleichzeitig auch der NAme der Verweisvariable, die dann im Code das Hauptfensters genutzt werden kann.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        // Instanz des UserControls
        private UserControl1 uc = new UserControl1() { Top=50, Left=50 };
    
        private Button btn = new Button() { Text = "Call method in UserControl", Dock = DockStyle.Top };
    
        private void Form25_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { btn,uc }); // simulate designer
          this.btn.Click += Btn_Click;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          uc.SetColor();  // Methode aufrufen
        }
    
        public class UserControl1 : UserControl
        {
          private Random rnd = new Random();
          public UserControl1() // constructor
          {
            this.BackColor = Color.Lime;
          }
    
          /// <summary>
          /// öffentliche von außen zugängliche Methode
          /// </summary>
          public void SetColor()
          {
            this.BackColor = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256));
          }
        }
      }
    }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 4. Februar 2021 04:53
  • Hallo,
    das UserControl habe ich mit der Maus auf das Formular gezogen.

    Eine Void Methode kann ich schon über "public void SetColor" im Code nutzen...
    Ich wollte aber eine Methode, die im Formular Designer verfügbar ist.

    Donnerstag, 4. Februar 2021 11:01
  • Hi,

    und was soll mit dieser Methode im Designer gemacht werden?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 4. Februar 2021 11:33
    Moderator
  • es soll Code eingetragen werden

    d.h. das geht in c# nicht ?

    Donnerstag, 4. Februar 2021 15:41
  • es soll Code eingetragen werden

    d.h. das geht in c# nicht ?

    Ich verstehe nicht, was Du willst. Soll im Designer der C# Code für diese Methode angegeben werden? Falls ja, was soll das bringen?

    Ich mein, zur Laufzeit dynamischen Code (bspw. im Sinne von Skripting bei bestimmten Aktionen, ...) zu hinterlegen würde mir noch einleuchten. Aber was soll das im Designer zur Entwurfszeit?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 4. Februar 2021 16:18
    Moderator
  • das Control wartet auf ein Gerät das Daten liefert.

    Wenn das Control alle nötigen Daten hat soll im Control die Methode gefüllt werden ..

    offensichtlich geht das in c# nicht :-(

    Donnerstag, 4. Februar 2021 16:31
  • Hi,

    ich befürchte, das Problem liegt in deinem Verständnis des Ablaufs eines Programms.

    Ich mein das nicht böse aber das, was Du da beschreibst, hat mit Code, der im Designer für eine Methode hinterlegt werden soll, rein gar nichts zu tun.

    Eine Methode wird auch nicht gefüllt, sondern aufgerufen.

    Wenn das Control an einem bestimmten Punkt etwas auslösen soll, wird man das in aller Regel über ein Ereignis machen, das dann zum Zeitpunkt x (in deinem Fall dann, wenn alle benötigten Daten vorliegen) ausgelöst wird. Irgendwo wird dann ein Eventhandler registriert, der auf das Auslösen dieses Ereignisses reagiert und "etwas" macht, bspw. deine Methode aufrufen.

    Aber nochmal: Das alles hat weder etwas mit dem Designer noch mit dynamisch zu hinterlegendem Code zu tun.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 4. Februar 2021 16:47
    Moderator
  • Hi,
    natürlich geht das auch in C#.

    Im Control wird zur Ausführungszeit eine Methode gestartet (entweder beim Laden oder durch Bedieneraktivität) und diese Methode wartet dann auf eine Antwort vom Gerät, üblicherweise nach einem Abschicken einer Anforderung an das Gerät.

    Wenn dann die Daten eintreffen, müssen diese aufbereitet werden (z.B. Bytes in Zeichenkette) und dann in den Thread des Oberflächenelementes zur Anzeige "umgeleitet" werden.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 4. Februar 2021 16:51
  • Hallo,

    versuche es mit der Annotation:
    [System.ComponentModel.Browsable(true)]
    Hier sollte dein Beispiel enthalten sein, schätze ich.
    http://openbook.rheinwerk-verlag.de/visual_csharp/visual_csharp_19_002.htm

    Grüße Alexander

    Freitag, 5. Februar 2021 20:49
  • Hallo futzi123,

    Ich nehme an, dass Peters Antworten Dir weitergeholfen haben. Bitte lass uns wissen, wenn Du zusätzliche Fragen hast.

    Gruß,

    Ivan Dragov

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 19. Februar 2021 13:07
    Moderator