RadioButton a runtime

mercoledì 11 marzo 2009 - 18.42

Spartacus Profilo | Newbie

Ciao a tutti sono di nuovo qua a chiedere il vostro prezioso aiuto.
Io dovrei aprire in modo dinamico una WinForm con l'elenco delle porte seriali installate nel pc.
Ho un metodo (PorteFisiche) che mi restituisce esattamente i nomi delle porte.
Da un altro metodo mi creo la nuova form, mi creo un radiobutton per ogni porta che mi viene restituita dal metodo di cui sopra, vado ad aggiungere il radiobutton appena creato ai controls della mia nuova form.
Quando mi visualizza la form mi viene visualizzato solamente un radiobutton.
Questo è il codice:

private void selezionaToolStripMenuItem_Click(object sender, EventArgs e)
{
RadioButton _rb;
Form _Selezione = new Form();
_Selezione.SuspendLayout();
_Selezione.Text = "Selezione della porta di comunicazione";
_Selezione.StartPosition = FormStartPosition.CenterParent;
foreach (string porta in this._com.PorteFisiche())
{
_rb = new RadioButton();
_rb.Name = porta;
_rb.Text = porta;
_rb.Location = new Point(0, _rb.Location.Y + 1);
_Selezione.Controls.Add(_rb);
_Selezione.SuspendLayout();

}
_Selezione.Show();

}
Qualcuno di voi saprebbe darmi uno spunto per risolvere il mio problema.
Come sempre grazie mille a tutti voi.
Cristian

Jeremy Profilo | Guru

Ciao Cristian.
Così a occhio, l'unica cosa che vedo e che potrebbe darti *l'impressione* che venga creato solo un radiobutton, è che 1 pixel di differenza tra uno e l'altro è davvero poco, direi quasi impercettibile, non tanto, per la quantità di pixel, ma per il fatto che un il secondo controllo copre sempre il primo, il terzo copre il secondo e via via così.....prova a modificare questa riga:
>_rb.Location = new Point(0, _rb.Location.Y + 1);
in questo modo:
>_rb.Location = new Point(0, _rb.Location.Y + 20);
Un'altra cosa *sicuramente sbagliata* è la riga successiva, quindi
_Selezione.SuspendLayout();
Che dovrebbe diventare ResumeLayout, dato che il suspend lo hai già fatto all'inizio.

Facci sapere...
Ciao


Spartacus Profilo | Newbie

Ciao Jeremy
Prima di tutto grazie per la risposta, ho provato a inserire esattamente le righe di codice che mi hai consigliato tu. il risultato è solamente quello che il radio button lo vedo un po più in basso come era prevedibile, per il resto tutto uguale a prima.
Sulla macchina che sto utilizzando ho una porta seriale COM1 e un adattatore usb <-> rs232 visto come porta seriale COM3.
Il radio button che vedo nella mia finestra ha semplicemente etichetta COM1, in pratica è come se dopo la prima istanza mi uscisse dal ciclo Foreach.
Ciao

Jeremy Profilo | Guru

Ciao Cristian.
Appena rientro provo il tuo codice e poi ti dico.
Ciao.

aiedail92 Profilo | Expert

Ciao

In realtà usando il codice che avete postato, i controlli vengono inseriti tutti quanti nella stessa posizione, perchè a quella di default (0, 0) aggiungete un valore fisso (0, 0 + 20)

Quello che bisogna fare invece è o avere la posizione del controllo precedente, oppure usare una variabile che faccia da indice per il controllo, per cui moltiplicare la posizione verticale:

int i = 0; foreach(ecc) { //ecc _rb.Location = new Point(0, 20 * i); //ecc i++; }

In alternativa puoi usare il controllo FlowLayoutPanel e inserire i tuoi RadioButton all'interno di questo, che provvede automaticamente ad ordinarli (imposta la proprietà FlowDirection a TopDown):

//Rimuove gli oggetti presenti tuoFlowPanel.Controls.Clear(); foreach(ecc) { //ecc tuoFlowPanel.Controls.Add(_rb); //ecc }

Luca

Jeremy Profilo | Guru

Ciao Luca.
Hai perfettamente ragione.....mi era sfuggito

Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5