Visual Express 2010 C# - Frage

df8oe

Cadet 2nd Year
Registriert
Dez. 2013
Beiträge
22
Hallo an alle,

ich möchte ein einziges Programm, das ich in php geschrieben habe, in eine Windows-GUI bringen. Normalerweise arbeite ich ausschliesslich unter "Linux" und ich werde auch nur diese eine Anwendung portieren müssen. Da das eigentliche Programm schon läuft - brauche ich es nur noch zu portieren und die Teile, die bislang fehlen, dazuprogrammieren. Dafür möchte ich aber nicht C# / Visual Express / Winforms komplett lernen - ich muss ja nur ein paar speziell darauf ausgelegte Programmteile (ich vermute stets nur wenige Zeilen Code) erstellen...

Ich habe einen "Programmkörper" mittels VE2010 C# erstellt. In dem Fenster gibt es ein paar Labels, die während der Laufzeit des Programmes mit wechselnden Werten befüllt werden sollen und diese Werte sollen dann auch im Fenster angezeigt werden. Ich bekomme es aber bislang trotz langen Probierens und googlens nicht hin, dass es funktioniert. Entweder, es gibt Compilerfehler, weil ich irgendwas mit Objekten oder Klassen nicht beachtet habe, oder es gibt keine Compilerfehler und es passiert einfach nichts.

Vielleicht gibt es hier jemanden, der mir mit den entscheidenden Zeilen weiterhelfen kann??

Hier der von VE erzeugte Code:

Form1.cs:
Code:
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        label1.Text = "Startwert";
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

Form1.Designer.cs:
Code:
namespace WindowsFormsApplication1
{
    public partial class Form1
    {
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Vom Windows Form-Designer generierter Code

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
            this.data_lokal = new System.Windows.Forms.RadioButton();
            this.data_netz = new System.Windows.Forms.RadioButton();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // data_lokal
            // 
            this.data_lokal.AutoSize = true;
            this.data_lokal.Location = new System.Drawing.Point(12, 26);
            this.data_lokal.Name = "data_lokal";
            this.data_lokal.Size = new System.Drawing.Size(47, 17);
            this.data_lokal.TabIndex = 0;
            this.data_lokal.TabStop = true;
            this.data_lokal.Text = "lokal";
            this.data_lokal.UseVisualStyleBackColor = true;
            this.data_lokal.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
            // 
            // data_netz
            // 
            this.data_netz.AutoSize = true;
            this.data_netz.Location = new System.Drawing.Point(12, 50);
            this.data_netz.Name = "data_netz";
            this.data_netz.Size = new System.Drawing.Size(62, 17);
            this.data_netz.TabIndex = 1;
            this.data_netz.TabStop = true;
            this.data_netz.Text = "@home";
            this.data_netz.UseVisualStyleBackColor = true;
            this.data_netz.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(297, 118);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(97, 13);
            this.label1.TabIndex = 2;
            this.label1.Text = "                              ";
            this.label1.Click += new System.EventHandler(this.label1_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackColor = System.Drawing.SystemColors.Window;
            this.ClientSize = new System.Drawing.Size(674, 392);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.data_netz);
            this.Controls.Add(this.data_lokal);
            this.Name = "Form1";
            this.Text = "Predictor";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.RadioButton data_lokal;
        private System.Windows.Forms.RadioButton data_netz;
        private System.Windows.Forms.Label label1;
    }
}

Program.cs:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.ExceptionServices;


namespace WindowsFormsApplication1
{
     static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());


// Hier steht mein Programmcode - er erzeugt Daten - nächste Zeile ein Beispiel:

           string mywert1 = "neuer Wert";

// Der Inhalt von mywert1 soll *JETZT UND AN DIESER STELLE* durch ein paar (??) Zeilen Code an die Stelle des Labels "label1" ausgegeben werden. Die nachfolgenden drei Zeilen waren ein Versuch, der aber nicht funktioniert hat:


                        Form1.ActiveForm.Controls["label1"].Text = mywert1;
                        Form1.ActiveForm.Controls["label1"].Update();
                        Form1.ActiveForm.Controls["label1"].Refresh();
         }
    }
}


Natürlich ist mir bewusst, dass das ein Kinderspeil ist, wenn man C# kann. Aber, wie bereits geschrieben: Es wird nur wenige Programmteile geben, die eben C# - spezifisch sind, und deswegen möchte ich das alles nicht komplett erarbeiten. Mein eigentlicher Code wird locker innerhalb von Main() stehen und ist daher leicht zu portieren...

Ich hoffe, dass es tatsächlich ganz einfach ist und mir jemand den nötigen Tipp geben kann...
df8oe
 
Ich denke, ein anderes Problem stellt die Tatsache da, dass du den Code nicht in "Program.cs" schreibst, sondern dass das alles in die Datei der Form kommt.
Bzw. sollte es "Form1.ActiveForm.label1.Tet = mywert1;" tun, das mit dem ".Controls["label1"]" kenne ich so garnicht :D Kann sein, dass es das gibt / es funktionieren kann, aber habe es nie gebraucht.

Wenn du einen Code schreiben möchtest, der nach und nach abgearbeitet wird -> Form1_Load

Kann sein, dass ich mich irre, und es durchaus machbar ist, dass man das "Programm" in die program.cs schreiben kann, habe es aber sowohl im "privaten Bereich" als auch in meiner Ausbildung bisher nie gesehen^^
 
@Snowi

Der Ansatz klingt mir recht interessant (und gleichzeitig sehr neu).

Alle C-Programme, dic ich bísher geschrieben habe, fingen mit main() an - dass es jemals anders sein könnte, ist mir nicht in den Sinn gebkommen....

Also mein Programm soll folgendes tun:

1) es holt sich Daten via OLE/COM von einem anderen laufenden Programm
2) es holt sich Daten via http://
3) es gibt Daten in seinem Fenster aus
4) es gibt Daten auf seriellen Schnittstellen aus
5) es wertet vom User gesetzte Radiobuttons für die Bearbeitung der Daten aus

1) bis 4) geschehen in einer Schleife zyklisch.

1) habe ich schon als C# - Konsolenprogramm erstellt und funktioniert - sollte also durch copy&paste übernommen werden können.
2) habe ich mich noch nicht mit beschäftigt - kann ich das programmtechnisch auch unter Form1_load erledigen?
3) hätte sich dann wohl erledigt, denn als Befehl untr Form1_Load habe ich das schon hinbekommen
4) wie 2)
5) sollte durch entsprechendes Setzen der Codeteile unter den "CheckedChanged()" Routinen zu erledigen sein...

Liege ich da richtig??

df8oe
 
Zuletzt bearbeitet:
Das mit Program.cs und Form1.cs hatte ich übersehen.

Alles nach Application.Run(new Form1()); wird (vermutlich) erst ausgeführt nachdem der Form geschlossen wird.
Wenn du die Werte ändern willst gibt es das Label (vermutlich) garnicht mehr und (vermutlich) hättest du so oder so von dort aus keinen Zugriff.

Dein Code muss in Form1.cs
 
Zuletzt bearbeitet: ((vermutlich))
Genial - danke für den kurzen "Tritt in den A*".

Ihr habt mir beide sehr geholfen!! Jetzt kann ich erstmal alleine weiterfrickeln :)

Einen schönen Restsonntag noch
df8oe
 
Das ist auch das Problem meiner Schulklasse - In den Konsolen-Anwendungen war das alles kein Problem: Man hatte seine Main() Funktion, die nacheinander abgearbeitet wurde. Sobald man mit Forms arbeitet, ändert sich das ganze: Die Main() wird theoretisch zur Form1_Load, und dort käme dann dein Code rein. Und das muss man um einen erstmal wissen, zum andern unter Umständen etwas dran gewöhnen.

Wenn das Programm quasi vor sich hin arbeitet, und nicht auf Eingaben des Users angewiesen ist, passt das alles sogar gut mit der Form1_Load.

Eine kleine Hilfe ist evtl. noch folgendes: http://openbook.galileocomputing.de/visual_csharp_2012/
(Ist vom Verlag selbst freigegeben, siehe galileocomputing.de->rechts "openbook")
 
@snowi

Nochmals vielen Dank! Nach deinem Tipp geht es mächtig voran. Da mein Code zyklisch abgearbeitet werden muss, habe ich ein timer-Objekt erzeugt und lasse meine Routine alle 1000ms "anstossen" - von der Eventauswertung des Timers. Ich habe meinen kompletten Code jetzt in einer eigenen Funktion (Teil der Klasse Form1) angelegt. Ich weiss aber, dass das so nicht ganz klappen kann - ich muss auch andere Codeteile in andere Eventauswertungen (Komboboxen etc.) packen. Wie ich dann die Variablen der einzelnen Bereiche "einander bekannt machen kann" - das werde ich dann vermutlich auch noch selbst herausfinden :)

Übrigens war niemand aus der Community "myCSharp.de" in der Lage, mir diesen einen einzigen entscheidenden Fingerzeig zu geben. Dort hat man meine Frage gelöscht und mir reichlich Links zum Erlernen von C# genannt. Alles schön und gut - aber wie oben bereits geschrieben: Ich werde nur diese eine einzige Anwendung mit C# erstellen. Ich programmiere hauptsächlich unter qt oder gtk (Linux) - da kenne ich mich aus. Alle "C's" haben unterschiedliche Dialekte - und doch kann man, etwas Fingerspitzengefühl und ein paar Anstösse von Aussen vorausgesetzt - auch in einer Sprache programmieren, die man NICHT so weit beherrscht, wie man es zum Erstellen eines Programmes sollte :)

In diesem Sinne:

Muchas Gracias - es geht voran...
df8oe
 
Schön mal ein danke von jemandem zu hören :D
Falls noch fragen sind, kannst du dich auch via PM bei mir melden, werd versuchen dir weiter zu helfen wenn möglich.
 
Zurück
Oben