none
Come scrivere in una textBox il nome dell'elemento da me selezionato in una listView? Attenzione : il testo deve apparire nello stesso Form ..non in una copia. RRS feed

  • Domanda

  • Sto lavorando ad un software di gestione spese ed entrate. Ho sviluppato delle categorie in una listView...ora vorrei che se clicco su un elemento del controllo...quel nome di quell'elemento mi apparisse in una textBox...please!!

    Ecco il mio codice...in pratica vorrei assegnare il nome di un elemento della listView1 del Form "Seleziona Categoria" alla richTextBox presente nella Form "Aggiungi", quindi sono Form diversi...

      private void ListView1SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    var items = listView1.SelectedItems[0].Text;
                    var aggiungi = new Aggiungi();
                    aggiungi.AggiungiTesto(items);
                    aggiungi.Show();               
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }           
            }

    e creo un metodo nel Form "Aggiungi" :

     public partial class Aggiungi : Form
        {
            public Aggiungi()
            {
                InitializeComponent();
            }
    
            public void AggiungiTesto(string text )
            {
                richTextBox1.Text = text;
            }
        }

    Ho problema : facendo così il testo viene visualizzato, ma in una copia del form Aggiungi...io vorrei che non si aprisse un nuovo Form "Aggiungi",  ma che mi si scrivesse direttamente nella richTextBox, senza aprire nuovi Form...

    domenica 24 febbraio 2013 21:19

Tutte le risposte

  • Ciao,

    basta che ti crei un campo nella classe ed usi sempre quello. Ad esempio :

    public class NomeClasse : Form { Aggiungi aggiungi = new new Aggiungi(); ... private void ListView1SelectedIndexChanged(object sender, EventArgs e) { try { var items = listView1.SelectedItems[0].Text; aggiungi.AggiungiTesto(items); aggiungi.Show(); } catch (Exception ex) { MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

    }

    Edit :

    Ovviamente se vuoi appendere il testo anzichè sostituirlo, usa AppendText dentro il metodo AggiungiTesto della classe Aggiungi :

    public partial class Aggiungi : Form
        {
            public Aggiungi()
            {
                InitializeComponent();
            }
    
            public void AggiungiTesto(string text )
            {
                richTextBox1.AppendText(text);
            }
        }




    • Modificato U 235 domenica 24 febbraio 2013 21:35
    domenica 24 febbraio 2013 21:26
  • Ciao ErPaciocco878,

    Sto lavorando ad un software di gestione spese ed entrate. Ho sviluppato delle categorie in una listView...ora vorrei che se clicco su un elemento del controllo...quel nome di quell'elemento mi apparisse in una textBox...please!!

    Ecco il mio codice...in pratica vorrei assegnare il nome di un elemento della listView1 del Form "Seleziona Categoria" alla richTextBox presente nella Form "Aggiungi", quindi sono Form diversi...

      private void ListView1SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    var items = listView1.SelectedItems[0].Text;
                    var aggiungi = new Aggiungi();
                    aggiungi.AggiungiTesto(items);
                    aggiungi.Show();               
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }           
            }

    e creo un metodo nel Form "Aggiungi" :

     public partial class Aggiungi : Form
        {
            public Aggiungi()
            {
                InitializeComponent();
            }
    
            public void AggiungiTesto(string text )
            {
                richTextBox1.Text = text;
            }
        }

    Ho problema : facendo così il testo viene visualizzato, ma in una copia del form Aggiungi...io vorrei che non si aprisse un nuovo Form "Aggiungi",  ma che mi si scrivesse direttamente nella richTextBox, senza aprire nuovi Form...

    puoi modificare il codice lasciando l'istanza del Form Aggiungi a livello di classe e gestire il controllo dell'apertura del Form Aggiungi mediante l'impostazione di una variabile anche bool che valorizzi alla prima apertura del Form , per meglio spiegare modifichi il codice così.

    La Classe Principale

            private bool isopen;
            Aggiungi aggiungi = new Aggiungi();
    
            private void ListView1SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    if(isopen.Equals(false))
                    {
                        var s = listView1.SelectedItems[0].Text;
    
                        aggiungi.AggiungiTesto(s);
                        aggiungi.Show();
                        isopen = true;
                    }
    
                    else
                    {
                        var s = listView1.SelectedItems[0].Text;
                        aggiungi.AggiungiTesto(s);                    
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }           
            }

    Dichiari a livello di Classe L'istanza del Form Aggiungi in modo da poter fare riferimento ovunque nella Classe e valorizzi la variabile IsOpen alla prima visualizzazione , successivamente il codice valutarea True la condizione If sulla variabile IsOpen ed eseguirà il costrutto Else richiamando il metodo AggiungiTesto e gli passerai come argomento l'items selezionato e sarà visibile sul controllo RichTextBox dellla classe Aggiungi.

    Ciao.



    domenica 24 febbraio 2013 21:55
  • Volendo puoi anche risparmiare il

    private bool isopen;

    sarebbe sufficiente :

    Aggiungi aggiungi = new Aggiungi(); private void ListView1SelectedIndexChanged(object sender, EventArgs e) { try {

    var s = listView1.SelectedItems[0].Text; aggiungi.AggiungiTesto(s);

    if(!aggiungi.Visible) aggiungi.Show(); } catch (Exception ex) { MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

    Carmelo, scusa, ma facendo come li hai suggerito non va ad istanziare un nuovo form? in quel caso si trova la prima chiamata corretta sul campo, poi le successive creano nuovi form.

    ho forse capito male io ciò che voleva?

    • Modificato U 235 domenica 24 febbraio 2013 22:19
    domenica 24 febbraio 2013 22:13
  • Ciao U235,

    Carmelo, scusa, ma facendo come li hai suggerito non va ad istanziare un nuovo form? in quel caso si trova la prima chiamata corretta sul campo, poi le successive creano nuovi form.

    ho forse capito male io ciò che voleva?

    si , ho messo una riga di troppo nel costrutto Else , grazie :) , quello che L'op voleva se ho capito bene e aprire il Form Aggiungi una volta e le volte successive popolare il controllo RichTextBox senza creare nuove istanze della Classe Aggiungi.

    Ciao.


    domenica 24 febbraio 2013 22:24
  • Figurati :)

    domandavo perchè pensavo di aver capito male io :( mi capita spesso :D

    Ciao :)

    domenica 24 febbraio 2013 22:26
  • In tutti e due i modi...viene sempre aperto un nuovo Form...non so più cosa fare...
    domenica 24 febbraio 2013 22:32
  • Ciao ErPaciocco878,

    In tutti e due i modi...viene sempre aperto un nuovo Form...non so più cosa fare...

    puoi mostrarci come hai modificato il codice ?

    Ciao.


    domenica 24 febbraio 2013 22:34
  • Ciao,

    guarda, in entrambe i modi, sia il mio, sia quello di Carmelo (dopo la correzione) non apre nuovi form... come lo hai modificato il codice?

    domenica 24 febbraio 2013 22:35
  • Ho solo cambiato questo :

      
      public void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    var s = listView1.SelectedItems[0].Text;
                    aggiungi.AggiungiTesto(s);
                    if (!aggiungi.Visible) aggiungi.Show();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }           
    
            }

    domenica 24 febbraio 2013 22:41
  • Con quel codice ti crea un solo form... Ma non è che tu hai tutto su un form e vuoi solo quello?
    domenica 24 febbraio 2013 22:45
  • Forse non avete capito alla perfezione : io, quando clicco su un pulsante, mi esce il Form "Aggiungi". In questo, clicco sul button "Seleziona categoria..." e mi viene fuori un altro Form con il medesimo nome. Ora, quando clicco su un elemento, mi si crea una copia del Form "Aggiungi". Lo so che mi si crea solo 1 volta, ma non deve apparire nemmeno quella volta, perché è già presente il Form.
    domenica 24 febbraio 2013 22:46
  • Ok, io non avevo capito, scusa...

    quindi la RichTextBox si trova sul form principale, clicchi sul button e ti si apre il secondo form con la listview, quando selezioni nel secondo form vuoi che l'item selezionato venga scritto nella richtextbox del form principale, è corretto?

    domenica 24 febbraio 2013 22:53
  • Si...
    domenica 24 febbraio 2013 22:54
  • Ciao ErPaciocco878,

    Si...

    allora la strada e l'inversa devi passare per riferimento il form principale al form dove hai il controllo ListView e valorizzare il controllo RichTextBox all'interno del Form dove  epresente il controllo ListView .

    Lo puoi fare cosi

    nella Classe principale apri il Form Aggiungi e gli passi per riferimento lo stesso Form

     private void Button1Click(object sender, EventArgs e)
            {
                var fraggiungi = new Aggiungi {Form1 = this};
                fraggiungi.Show();
            }

    Invece nel Form aggiungi valorizzi il controllo RichTextBox mediante la proprietà Controls.

       public partial class Aggiungi : Form
        {
            public Form1 Form1;
    
            public Aggiungi()
            {
                InitializeComponent();
            }
    
            private void ListView1SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    Form1.Controls["richtextbox1"].Text = listView1.SelectedItems[0].Text;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    Spero di aver capito.

    Ciao.


    domenica 24 febbraio 2013 23:04
  • ok, allora la cosa più semplice è rendere la listview del form2 public, il resto lo fai così :

    public partial class Form1 : Form
        {
            Form2 f = new Form2();
            public Form1()
            {
                InitializeComponent();
                f.listView1.SelectedIndexChanged += new EventHandler(listView1_SelectedIndexChanged);
            }
    
            void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                if(f.listView1.SelectedItems.Count>0)
                    this.richTextBox1.AppendText(f.listView1.SelectedItems[0].Text);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (!f.Visible) f.Show();
            }
    
        }
    Diversamente se non vuoi fare la listview public (ci sarebbero diversi motivi per non farla public, in ogni caso è meglio se la fai internal) dovresti implementare un evento che viene sollevato dal SelectedIndexChanged della listview, a questo evento aggiungi un delegato che lavora sul form 1.


    • Modificato U 235 domenica 24 febbraio 2013 23:15
    domenica 24 febbraio 2013 23:10
  •   public void toolStripButton8_Click(object sender, EventArgs e)
            {
                var fraggiungi = new Aggiungi {Form1 = this };
                fraggiungi.Show();
    
            }

    Mi da, in questo metodo(parola "Form1"), errore = "Rubrica.Aggiungi non contiene una definizione per Form1" e, in :

      public void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                  try
                {
                    Form1.Controls["richtextbox1"].Text = listView1.SelectedItems[0].Text;
                } 
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            
    
            }

    (Parola "Form1") l' errore : "Occorre un riferimento a un oggetto per la proprietà, il metodo o il campo non statico "System.Windows.Forms.Control.Controlsget""

    domenica 24 febbraio 2013 23:14
  •   public void toolStripButton8_Click(object sender, EventArgs e)
            {
                var fraggiungi = new Aggiungi {Form1 = this };
                fraggiungi.Show();
    
            }

    Mi da, in questo metodo(parola "Form1"), errore = "Rubrica.Aggiungi non contiene una definizione per Form1" e, in :

      public void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                  try
                {
                    Form1.Controls["richtextbox1"].Text = listView1.SelectedItems[0].Text;
                } 
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            
    
            }

    (Parola "Form1") l' errore : "Occorre un riferimento a un oggetto per la proprietà, il metodo o il campo non statico "System.Windows.Forms.Control.Controlsget""

    devi aggiungere il get e il set nella classe Aggiungi :

    public Form1 Form1 {get;set;}
    domenica 24 febbraio 2013 23:23
  • Ciao ErPaciocco878,

      public void toolStripButton8_Click(object sender, EventArgs e)
            {
                var fraggiungi = new Aggiungi {Form1 = this };
                fraggiungi.Show();
    
            }

    Mi da, in questo metodo(parola "Form1"), errore = "Rubrica.Aggiungi non contiene una definizione per Form1" e, in :

      public void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                  try
                {
                    Form1.Controls["richtextbox1"].Text = listView1.SelectedItems[0].Text;
                } 
                catch (Exception ex)
                {
                    MessageBox.Show("Errore!" + " " + listView1.SelectedItems.Count.ToString(), "Errore!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            
    
            }

    (Parola "Form1") l' errore : "Occorre un riferimento a un oggetto per la proprietà, il metodo o il campo non statico "System.Windows.Forms.Control.Controlsget""

    ti lascio il progetto di esempio http://sdrv.ms/XKnZTe .

    Ciao.


    lunedì 25 febbraio 2013 05:12