View Full Version : [C# / WinForms]Array
RaouL_BennetH
25-07-2012, 23:03
Ciao a tutti :)
Ho un controllo di tipo TableLayoutPanel (ma potrebbe essere un controllo qualunque...) composto da 7 colonne e 7 righe.
Devo trovare una soluzione per fare in modo che, a runtime, su tale controllo vengano posizionati altri controlli (es. Button).
Ovviamente, il tipo di soluzione che devo trovare è che se ho aggiunto un controllo in posizione (0, 0), il successivo mi venga aggiunto in posizione (0, 1) e così via fino ad esaurire le posizioni disponibili nella riga e passare alla riga successiva.
Giusto per fare un esempio:
private void someBtn_Click(object sender, EventArgs e)
{
Button testButton = new Button();
testButton.Text = "Sono il primo";
mioTableLayoutControl.Controls.Add(testButton, 0, 0);
}
Grazie in anticipo a tutti.
RaouL.
Ho un controllo di tipo TableLayoutPanel (ma potrebbe essere un controllo qualunque...) composto da 7 colonne e 7 righe.
Devo trovare una soluzione per fare in modo che, a runtime, su tale controllo vengano posizionati altri controlli (es. Button).
Ovviamente, il tipo di soluzione che devo trovare è che se ho aggiunto un controllo in posizione (0, 0), il successivo mi venga aggiunto in posizione (0, 1) e così via fino ad esaurire le posizioni disponibili nella riga e passare alla riga successiva.
Forse c'è qualcosa nel tuo quesito che mi sugge, ma se stai usando un TableLayoutPanel, puoi semplicemente usare il primo degli Overloads di Add(), ossia quello che richiede in argomento solo il controllo senza row e column. Con Add() il TableLayoutPanel automaticamente li dispone prima per righe, poi per colonne.
Se invece vuoi estendere questa funzionalità ad un container qualsiasi ( Form, Panel, ... ) la devi implementare tu, magari creando una Classe che eredita-da, e gestendo dimensioni del nuovo controllo in arrivo, ridimensionamento righe, colonne, ordine di inserimento, ecc...
C'è parecchio da fare, ma dal momento che esiste già il TableLayoutPanel, creato proprio per queste "matrici di controlli" non ne vedrei il motivo...
RaouL_BennetH
26-07-2012, 08:59
Forse c'è qualcosa nel tuo quesito che mi sugge, ma se stai usando un TableLayoutPanel, puoi semplicemente usare il primo degli Overloads di Add(), ossia quello che richiede in argomento solo il controllo senza row e column. Con Add() il TableLayoutPanel automaticamente li dispone prima per righe, poi per colonne.
Se invece vuoi estendere questa funzionalità ad un container qualsiasi ( Form, Panel, ... ) la devi implementare tu, magari creando una Classe che eredita-da, e gestendo dimensioni del nuovo controllo in arrivo, ridimensionamento righe, colonne, ordine di inserimento, ecc...
C'è parecchio da fare, ma dal momento che esiste già il TableLayoutPanel, creato proprio per queste "matrici di controlli" non ne vedrei il motivo...
Infatti... il primo Overload mi era proprio sfuggito !! :(
Per ricavare poi la posizione del controllo ho usato il suo metodo:
GetControlFromPosition(col, row).
Avrei però una domanda da porti sperando nel tuo aiuto:
I tipi di oggetti che devo aggiungere sono tutti Button.
Ora, per ciascuno di essi, dovrei anche aggiungere a runtime un evento "click".
In pratica:
Button touchButton = new Button();
touchButton.Text = listBox2.SelectedItem.ToString();
touchButton.Dock = DockStyle.Fill;
touchButton.FlatStyle = FlatStyle.Flat;
touchButton.FlatAppearance.BorderSize = 0;
touchButton.BackColor = Color.Green;
touchButton.Click += new EventHandler(blah);
tableKeyb.Controls.Add(touchButton);
Ovviamente l'evento dev'essere diverso per ciascun bottone.
RaouL_BennetH
26-07-2012, 09:26
Al momento sto procedendo così:
public class RuntimeButton : Button
{
public delegate void RuntimeButtonClickHandler(string action);
public event RuntimeButtonClickHandler ButtonClicked;
//alcune proprietà....
public RuntimeButton(string btnText)
{
this.Text = btnText;
this.ButtonClicked += new RuntimeButtonClickHandler(RuntimeButton_ButtonClicked);
}
void RuntimeButton_ButtonClicked(string action)
{
}
}
...
Avrei però una domanda da porti sperando nel tuo aiuto:
I tipi di oggetti che devo aggiungere sono tutti Button.
Ora, per ciascuno di essi, dovrei anche aggiungere a runtime un evento "click".
...
Da quanto mi sembra di capire, vorresti creare una "pulsantiera" dinamica, ossia il cui numero di Button non è fisso e predeterminato, ma variabile a runtime, ebbene, se hai reminiscenze VB6, è una "Matrice di controlli".
Quello che invece non mi è chiaro è il bisogno di creare anche una Delegate nel codice del post seguente.
Per ora ti passo il link ad un mio Articolo Blog in cui faccio alcuni esempi interessanti sulla gestione di Matrici di Controlli in .NET. Il codice è VB.NET, ma non ti sarà difficile tradurlo velocemente in C# :
http://marcoggblog.blogspot.it/2012/01/vbnet-matrici-di-controlli-con-linq.html
Poi magari vediamo di capire più precisamente il tuo scopo... ;)
RaouL_BennetH
29-07-2012, 23:34
Da quanto mi sembra di capire, vorresti creare una "pulsantiera" dinamica, ossia il cui numero di Button non è fisso e predeterminato, ma variabile a runtime, ebbene, se hai reminiscenze VB6, è una "Matrice di controlli".
Quello che invece non mi è chiaro è il bisogno di creare anche una Delegate nel codice del post seguente.
Per ora ti passo il link ad un mio Articolo Blog in cui faccio alcuni esempi interessanti sulla gestione di Matrici di Controlli in .NET. Il codice è VB.NET, ma non ti sarà difficile tradurlo velocemente in C# :
http://marcoggblog.blogspot.it/2012/01/vbnet-matrici-di-controlli-con-linq.html
Poi magari vediamo di capire più precisamente il tuo scopo... ;)
Ok, perfetto grazie :) Dopo averlo letto potrei anche utilizzarlo in VB.Net, il linguaggio di base non è fondamentale.
In pratica devo realizzare una tastiera per un'applicazione che farà uso esclusivo di un touch screen. Al momento mi devo concentrare sui "pulsanti", in seguito, ciascuna di queste matrici dovrò memorizzarla in una "pagina"...
Grazie per il momento :)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.