[C#] problema con un programma

di il
15 risposte

[C#] problema con un programma

Ciao ragazzi.. sono nuovo con il c# e mi serverebbe una mano: stasera, per allenarmi e cercare di comprendere meglio il linguaggio, ho scritto questo codice che in teoria dovrebbe mostrare in u form principale un bototne, e premendolo si apre una finestra di sfoglia file. scegliendo un file di testo si aprirebbe una nuova finestra, dove viene mostrata la prima riga del file di testo. poi premendo il pulsante chiudi la finestra secondaria si chiuderebbe, e cosi via.. solo che non fa quel che dovrebbe fare... mi dareste una mano per favore?


posto il codice..

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;
using System.IO;

namespace esempio_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            caricaform();
        }

        public void caricaform()
        {
            Form form1 = new Form();
            Button button1 = new Button();
            form1.Text = "Sfoglia!";
            button1.Location = new Point(10, 10);
            button1.Text = "Sfoglia";
            button1.Click += new EventHandler(button1_load);
            form1.ShowDialog();
        }
        public void button1_load(object sender, EventArgs e)
        {
            try
            {
            sfoglia_load(sender,e);
              
            }
            catch (FileNotFoundException)
            {
                MessageBox.Show ("Errore: file non trovato!","Errore!",MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch(Exception ex)
            {
                MessageBox.Show("Errore:"+ex.Message,"Errore!",MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
           public void sfoglia_load(object sender, EventArgs e)
           {
            OpenFileDialog sfoglia= new OpenFileDialog();
            sfoglia.Filter="Text Files (*.txt)|*.txt";
            sfoglia.InitialDirectory=@"c:\users\tommaso\desktop";
            sfoglia.ShowReadOnly=true;
            sfoglia.ReadOnlyChecked=true;
            sfoglia.CheckFileExists=false;
            if (sfoglia.ShowDialog() == DialogResult.OK)
            {
                string line;
                StreamReader leggifile = new StreamReader(sfoglia.FileNames[0]);
                line = leggifile.ReadLine();
                Form form2= new Form();
                Button button3= new Button();
                form2.Size= new Size (100,120);
                form2.StartPosition=FormStartPosition.CenterParent;
                form2.Show();
                button3.Text="OK";
                form2.Text=line;
                leggifile.Close();
                if (button3.Capture  == true)
                    form2.Close();

            }
           }




        }

}
grazie mille a tutti!

15 Risposte

  • Re: [C#] problema con un programma

    Ciao drasgo,
    in 'caricaform' non inserisci il bottone nel form, è per questo che non si vede, dovresti scrivere:
    
    form1.Controls.Add(button1)
    
  • Re: [C#] problema con un programma

    Okay.. ho notato l'errore che ho tralasciato per mia distrazione.. purtroppo alla fine, il bottone ok(button3), quandp lo premo non fa uscire da quella form, e alla fine, quando chiudo la form principale, mi si apre da solo au'altra form sconosciuta senza titolo ne testo ne nulla.. e non capisco perche.. scusa per il disturbo..
    
    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;
    using System.IO;
    
    namespace esempio_1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                caricaform();
            }
    
            public void caricaform()
            {
                Form form1 = new Form();
                Button button1 = new Button();
                form1.Text = "Sfoglia!";
                button1.Location = new Point(10, 10);
                button1.Text = "Sfoglia";
                form1.Controls.Add(button1);
                button1.Click += new EventHandler(button1_load);
                form1.ShowDialog();
            }
            public void button1_load(object sender, EventArgs e)
            {
                try
                {
                    sfoglia_load(sender, e);
    
                }
                catch (FileNotFoundException)
                {
                    MessageBox.Show("Errore: file non trovato!", "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore:" + ex.Message, "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            public void sfoglia_load(object sender, EventArgs e)
            {
                OpenFileDialog sfoglia = new OpenFileDialog();
                sfoglia.Filter = "Text Files (*.txt)|*.txt";
                sfoglia.InitialDirectory = @"c:\\users\\tommaso\\desktop";
                sfoglia.ShowReadOnly = true;
                sfoglia.ReadOnlyChecked = true;
                sfoglia.CheckFileExists = false;
                if (sfoglia.ShowDialog() == DialogResult.OK)
                {
                    string line;
                    StreamReader leggifile = new StreamReader(sfoglia.FileNames[0]);
                    line = leggifile.ReadLine();
                    Form form2 = new Form();
                    form2.Bounds = new Rectangle(10, 10, 300, 400);
                    TextBox textbox1 = new TextBox();
                    textbox1.Location = new Point(10, 10);
                    textbox1.Size = new Size(200, 300);
                    Button button3 = new Button();
                    form2.Text = "Visualizza";
                    form2.StartPosition = FormStartPosition.CenterParent;
                    form2.Controls.Add(button3);
                    form2.Controls.Add(textbox1);
                    form2.Show();
                    button3.Text = "OK";
                    button3.Location = new Point(120, 250);
                    textbox1.Text = line;
                    leggifile.Close();
                    form2.CancelButton = button3;
                    button3.Click += new EventHandler(button3_load);
    
                }
    
    
            }
            public void button3_load(object sender, EventArgs e)
            {
    
                this.Close();
    
            }
    
        }
    }
    
    
    
    
    
  • Re: [C#] problema con un programma

    Il form sconosciuto in realtà è il form principale, che tu blocchi facendo uscire un' altro form (quello che crei a run time), prova a commentare 'form1.ShowDialog();', vedrai che il form principale ti appare subito. E' li che dovresti inserire il bottone (magari a design time).
  • Re: [C#] problema con un programma

    Dimenticavo, nel costruttore del form principale dovresti rimettere 'InitializeComponent();' che hai cancellato
  • Re: [C#] problema con un programma

    Scusa, non riesco a capire dove devo commentare.. ora, quando faccio parrtire il debug è tutto a posto a parte il bottone finale che non mi fa uscire dal form2, ma, quando chiudo il form1, non esce piu il form che tu dici essere quello principale, ma in compenso mi notifica un errore in program.cs, dicendomi che run.application(Form1()) non puo far partire il secondo ciclo di messagi su un thread singolo e mi consiglia di utilizzare .ShowDialog..
    tu mi consiglia di progettarla prima graficamente e poi collegare le varie parti con eventhandler?.. è che cosi soono capace, ma non bravissimo.. preferisco cosi.. ma se mi dici che se no non ci sono alternative, vedo di imparare..
  • Re: [C#] problema con un programma

    Prova a ripartire da zero. Fai un nuovo progetto C# Windows Form e non scrivere niente. Lancia il programma e vedrai apparire un form vuoto chiamato Form1. Ebbene questo è il form principale, non hai dovuto fare proprio nulla per crearlo (ha scritto tutto l' IDE), dentro questo form potrai mettere o a desin time o a run-time i controlli che desideri.

    La cosa che normalmente si fa è quella di inserirli a design time, in questo modo è più semplice posizionare i controlli, apri il form1, selezioni la toolbox e trascini un bottone dentro al form, poi ci fai doppio click sopra e ti crea ed apre la funzione di risposta al click, per provarla scrivici 'MessageBox.Show("Ciao");'. Come vedi si fa il tutto in un istante.

    Se invece preferisci crearli a run-time è ugualmente semplice e ne parliamo dopo.
  • Re: [C#] problema con un programma

    Perfetto, e capisco anche che ci posso mettere dentro quello che mi serve.. scusa se sono cosi negato, è che vengo dal c++ e sono abituato a dover scrivere tutto e di piu.. saranno 3/4 giorni che sono sul c# e non sono ancora perfettamente ambientato.. non mi par vero di poter usare un "progettatore grafico"..
  • Re: [C#] problema con un programma

    Venire dal C++ è una buona cosa, ti troverai a tuo agio e apprezzerai molte delle migliorie introdotte dal C#, personalmente ho trovato stupenda l' eliminazione dei .h

    Per inserire un pulsante a run-time puoi scrivere:
    
    Button button1 = new Button();
    button1.Location = new Point(10, 10);
    button1.Text = "Sfoglia";
    button1.Click += new EventHandler(button1_load);
    Controls.Add(button1);  // o anche this.Controls.Add(button1);
    
    Questo codice lo puoi richiamare dal costruttore del form.
  • Re: [C#] problema con un programma

    Questo lo conosco(dico il run-time).. abbastanza bene.. ho studiato su una guida che si chiama ab..C# e spiega la parte grafica con i windows form solo in run-time.. praticamente nulla sul design time.. comunque non ho ancora capito come si progetta e si scrive una dll, da esportare dal c/c++ o dal c# a tutti gli altri linguaggi.. sai, sono abbastanza giovane e non li conosco molto bene, pero mi sto allenando in c, c++ java e c# e ci sono alcune cose che alcuni linguaggi permettono di fare motlo piu semplicemente..




    okay.. perfetto.. ora funziona tutto tranne l'ultimo bottone che serve a chiudere il form 2.. o ci piazzo un bel eventhandler, e allora chiude tutti i form, o ci piazzo un bel form2.CancelButton=button2 e allora non fa niente.. una via di mezzo nonn c'è..

    
    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;
    using System.IO;
    namespace eila
    {
        public partial class esempio1 : Form
        {
            public esempio1()
            {
                InitializeComponent();
            }
            private void esempio1_Load(object sender, EventArgs e)
            {
    
            }
    
    
    
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    sfoglia_load(sender, e);
    
                }
                catch (FileNotFoundException)
                {
                    MessageBox.Show("Errore: file non trovato!", "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore:" + ex.Message, "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            public void sfoglia_load(object sender, EventArgs e)
            {
                OpenFileDialog sfoglia = new OpenFileDialog();
                sfoglia.Filter = "Text Files (*.txt)|*.txt";
                sfoglia.InitialDirectory = @"c:\\users\\tommaso\\desktop";
                sfoglia.ShowReadOnly = true;
                sfoglia.ReadOnlyChecked = true;
                sfoglia.CheckFileExists = false;
                if (sfoglia.ShowDialog() == DialogResult.OK)
                {
                    string line;
                    StreamReader leggifile = new StreamReader(sfoglia.FileNames[0]);
                    line = leggifile.ReadToEnd();
                    Form form2 = new Form();
                    form2.Bounds = new Rectangle(10, 10, 300, 400);
                    Label label1 = new Label();
                    label1.Size = new Size(200, 200);
                    label1.Location = new Point(50, 50);
                    form2.Controls.Add(label1);
                    Button button3 = new Button();
                    form2.Text = "Visualizza";
                    form2.StartPosition = FormStartPosition.CenterParent;
                    form2.Controls.Add(button3);
                    form2.Show();
                    button3.Text = "OK";
                    button3.Location = new Point(120, 250);
                    label1.Text = line;
                    leggifile.Close();
                    form2.CancelButton = button3;
                
    
                }
    
    
            }
          
    
            private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                this.Text = "nuova applicazione";
                this.Visible = true;
                this.Icon = new Icon(@"c://favicon.ico");
    
            }
    
          
        }
    }
    
    
    o se no con l'eventhandler diverrebbe cosi..
    
        button3.Click += new EventHandler(button3_load);
    
    
      public void button3_load(object sender, EventArgs e)
            {
    
                this.Close();
    
            }
    
    
  • Re: [C#] problema con un programma

    La creazione di controlli a run-time è una tecnica che devi conoscere, ma che di solito non usi, normalmente i form vengono sviluppati a design-time.

    Questo discorso vale anche per il form2 ti conviene crearlo a design-time. Vai sul menu 'Project/Add Windows Form' ed aggiungi un form chiamato come ti pare (diciamo Form2), e mettici dentro un po di controlli (a design-time). Per richiamarlo dal form1 devi scrivere:
    
    Form2 form2 = new Form2();
    form2.ShowDialog();
    
    (Nota che Form2 ora è il nome di una classe) Per chiuderlo basta che ci metti dentro (sempre a design-time) un bottone in cui hai impostato (sempre a design-time) la property DialogResult a 'Cancel' oppure a 'Ok'.

    Se invece visualizzi il form non modale (quindi richiami Show invece che ShowDialog) per chiuderlo devi mettere nel Click del bottone una chiamata al metodo 'Close'.
  • Re: [C#] problema con un programma

    Capito.. per allenarmi volevo creare una cosetta un po piu complicata e spastica.. Ciao a tutti, saprest dirmi se c'è un comando c# che dopo aver cliccato su un pulsante e essere andato su una nuova form, permetta di chiudere in automatico quella vecchia?

    volevo creare la form principale, schiaccio il pulsante e la chiude o nasconde, e intanto apre un'altra finestra, schiaccio un pulsante e ti porta su un'altra finestra chiudendo quella precedente, cosi per i form (form 1 (principale), form2, form3, form4) e al form 4 un pulsante che chiude quel form e ti riporta sul form1, quello principale.. dimmi se nonn sono stato( quasi sicuramente) chiaro.. grazie



    okay.. con un po di lavoro e ragionamento sono riuscito a eliminare l'errore..
    grazie uguale!sei stato utilissimo!
  • Re: [C#] problema con un programma

    Ciao drasgo,
    per chiudere un form basta richiamare il metodo Close(), per cui se il form2 vuole aprire il form3 e chiusersi basta che faccia:
    
    Form3 form = new Form3();
    form.Show();
    Close();
    
    C' è pero un problema a fare la stessa cosa dal form principale, quando chiudi il form principale l' applicazione termina e tutti i form vengono chiusi. Non escludo che esista qualche trucco che non conosco per evitare questo, per il momento l' unico suggerimento che mi viene in mente è quello di richiamare il metodo Hide() al posto del Close().
  • Re: [C#] problema con un programma

    Strano.. come ti ho detto sono riuscito a risolvere .. con questo codice, e, quando schiaccio il primo pulsante chiude iòl form principale e apre quello secondario.. e ho usato lo stesso codice per tutti i form e sembra funzionare correttamente..

    
      private void button2_Click(object sender, EventArgs e)
            {
                
                this.Hide();
                Form1 form1 = new Form1();
                form1.ShowDialog();
                this.Close();
            }
    
    cosi dovrebbe funzionare come avevo chiesto io all'inizio..
    se vuoi, prova a vedere se è totalmente corretto o se sfrutto solo qualche bug del sistema..
  • Re: [C#] problema con un programma

    Ok, quando schiacci il bottone nascondi (non chiudi) il form principale, esegui in maniera modale il secondo (in questo modo il form principale rimane bloccato), quando chiudi il form1 chiudi il form principale e di conseguanza l' applicazione. È tutto giusto.
Devi accedere o registrarti per scrivere nel forum
15 risposte