Laden...

Zugriff auf Element einer Form?

Erstellt von lebes vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.201 Views
L
lebes Themenstarter:in
82 Beiträge seit 2006
vor 17 Jahren
Zugriff auf Element einer Form?

Hallo,

bin neu im Umgang mit Visual C# Forms. Habe nun eine Form entwickelt mit einem Button und einem Prograss Bar.

Will ich auf diese Objekte zugreifen, so ist das innerhalbt der Form Klasse kein Problem. Wie kann ich aber von "außen" darauf zugreifen?

Mein naiver Angang sieht so aus:



static void Main()
        {
            
            Form1 Oberfläche = new Form1();
            Oberfläche.PB_Fortschrittsbalken.Value = 5;
         }

Nur leider kennt er das Objekt PB_Fortschrittsbalken hinter Oberfläche überhaupt nicht.

Kann mir jemand schnell mal auf die Füße helfen. Danke.

Gruß

B
1.529 Beiträge seit 2006
vor 17 Jahren

Schau mal im Code deiner Form, was vor der Definition von PB_Fortschrittsbalken steht...

T
94 Beiträge seit 2006
vor 17 Jahren

hallo

[FAQ] Kommunikation von 2 Forms
das sollte dir weiterhelfen.

mfg

//edit:

falls du aus einer klasse heraus auf ein control von form1 zugreifen willst so würd ich das zb mit dem konstruktor übergeben zB


class test
{
 public test(progressBar pb)
 {
   this.pb = pb;
 }
 public void something()
 {
   pb.value = 50;
 }
 private progressBar pb = null;
}

falls du nichts von beidem brauchst hab ich deine frage nich verstanden 😉

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.

L
lebes Themenstarter:in
82 Beiträge seit 2006
vor 17 Jahren

@Borg: Also ehrlich gesagt kommt in meiner Form Klasse das Objekt PB_Fortschrittsbalken garnicht vor. Ich habe es nur im Entwickler in die Form eingebaut und kann in der Form Klasse auch darauf zugreifen. Außerhalb der Form Klasse kann ich leider nicht darauf zugreifen.

@thejudge: Daran hatte ich auch schon gedacht das Controll zu übergeben, aber da ich im hauptprogramm auf eine Vielzahl von Controls zugreifen muss, müsste ich ja jedes einzeln übergeben. Das kann doch sicher nicht der einzige Weg sein.
In VB zB konnte ich eig. immer ganz problemlos von überall auf meine Controlls zugreifen.

Gruß

L
lebes Themenstarter:in
82 Beiträge seit 2006
vor 17 Jahren

Hier nochmal vollständig mein Code:


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void B_DatenEinlesen_Click(object sender, EventArgs e)
        {
            int cIndex;
            for (cIndex=1; cIndex<=100;cIndex++)
            PB_Fortschrittsbalken. = cIndex;  <---- hier kann ich problemlos auf das Obekt zugreifen

            

            Program.DatenLeseObject.KundenTabelleVerbinden();
            Program.Cholesky_Init();
            
        }



und hier das Programm:


static class Program
    {
        

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Init();
            Form1 Oberfläche = new Form1();
            
            Oberfläche.  <---- hier kennt er den PB_Fortschrittsbalken leider nicht
            Form1.   <------ so kennt er in leider auch nicht
            

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(Oberfläche);

             
            
        }


Es muss doch möglich sein aus dem Hauptprogramm aus auf die Controls zuzugreifen ohne alle Controls einzeln zu übergeben.

Gruß

F
10.010 Beiträge seit 2004
vor 17 Jahren

Bitte versuche dich von deinem VB vorleben zu trennen.

Du willst jetzt C# also OOP machen, und da ist die VB herangehensweise falsch.

Sieh bitte den von theJudge angegebenen Artikel an:
[FAQ] Kommunikation von 2 Forms

B
1.529 Beiträge seit 2006
vor 17 Jahren

Also ehrlich gesagt kommt in meiner Form Klasse das Objekt PB_Fortschrittsbalken garnicht vor. Ich habe es nur im Entwickler in die Form eingebaut und kann in der Form Klasse auch darauf zugreifen. Außerhalb der Form Klasse kann ich leider nicht darauf zugreifen.

Lass das bloß nicht herbivore hören. Schau dir mal die Form1.Designer.cs an...

Daran hatte ich auch schon gedacht das Controll zu übergeben, aber da ich im hauptprogramm auf eine Vielzahl von Controls zugreifen muss, müsste ich ja jedes einzeln übergeben. Das kann doch sicher nicht der einzige Weg sein.

Wenn du den Designer nutzt, dann kannst du die Werte ja auch gleich dort eingeben. Ansonsten schau dir mal InitializeComponent sowie den Konstruktor des Forms an oder nutze das Ereignis Load...
Und wenn du die Daten wirklich in Main ermitteln musst (bspw. Kommandozeilenargumente), kannst du sie ja einfach in ein struct oder eine eigene Klasse packen und diese übergeben.

In VB zB konnte ich eig. immer ganz problemlos von überall auf meine Controlls zugreifen. In VB kannst du auch mit Strings rechnen. VB folgt halt dem Quick and Dirty Ansatz. Des weiteren liegt das einfach daran, dass die Startmethode in der gleichen Klasse wie die Form liegt. Das kannst du in C# auch alles machen. Es ist bloss der VS-Designer, der diese Form vorgibt...

L
lebes Themenstarter:in
82 Beiträge seit 2006
vor 17 Jahren

Verstehe leider adhoc nicht recht was da steht. Ich will ja garnicht, dass zwei Forms miteinander kommunizieren, sondern nur auf das eine Haupform zugreifen können. Als Hauptform deklariere ich ja Oberfläche und es scheint mir ganz natürlich, dass ich über Oberfläche.xxx auf die Controls zugreifen könnte. Aber das funktioniert leider nicht. Was genau mach ich den da falsch?

Sry für meine sicher wenig qualifizierten Fragen, aber ein kurzes Codebeispiel würde mir sehr helfen.

Gruß

T
94 Beiträge seit 2006
vor 17 Jahren

du kannst nich mit Form1.Button oder sowas auf controls zugreifen.. is einfach nich drinne 😉

was du machen kannst is ein array mit controls zu erstellen und dann wie oben beschrieben die controls mim konstruktor zu übergeben


// also ein control[] array erstellen und dann übergeben
// Control[] cons = new Control[100]; evtl auch mal über Liste<> probieren, wäre eine bessere Lösung wenns geht List<Control> cons = new List<Control>();
// cons[0] = button1; mit list dann halt cons.add(buton1);

class test
{
 public test(params control[] parameterliste)
 {
   this.controls = parameterliste;
 }
 private control[] controls;
}
// so oder so ähnlich sollte es funktionieren ;)

mfg

If you don't like me for who I am, then you don't like me for who I am, but all you're gonna get, is who I am.