Oppure

Loading
14/03/17 8:46
Sevenjeak
Salve,

Sto creando, il questi giorni, un controllo posizionato nella parte superiore, simulando una toolbar, contenente dentro dei panelli, simulando delle colonne.

So che per fare una struttura a colonne potrei utilizzare il TableLayoutPane, ma avrei la necessità di far inserire più elementi in ogni colonna, cosa che questo controllo non fa.

Fino ad ora il codice del componente è questo:

public class xComponent : ContainerControl
private List<Panel> columns = null;
        private BorderStyle columnsBorderStyle = BorderStyle.None;

        public BorderStyle ColumnsBorderStyle
        {
            get
            {
                return columnsBorderStyle;
            }set
            {
                columns.ForEach(delegate (Panel element)
                {
                    element.BorderStyle = value;
                });

                columnsBorderStyle = value;
            }
        }

        public xComponent(int num_columns, params int[] percentSize)
        {
            Dock = DockStyle.Top;
            BackColor = Color.FromArgb(230, 230, 230);
            Size = new Size(968, 30);
         
            columns = new List<Panel>();

            // Add columns into the control
            for (int i = 0; i < num_columns; i++)
            {
                columns.Add(new Panel());
                columns[i].Height = Height;
                Controls.Add(columns[i]);
            }

            positionColumns(num_columns, percentSize);
        }

        public Panel Column(int index)
        {
            return columns[index];
        }

        private void positionColumns(int num_columns, int[] percentSize)
        {
            for (int i = 0; i < num_columns; i++)
            {
                columns[i].Left = (i > 0) ? columns[i - 1].Width : 0;
                columns[i].Width = (percentSize.Length == 0) ? Width / num_columns : (Width * percentSize[i]) / 100;
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
        }
    }


Creato e aggiunto nel form in questo modo:

 xComponent xc = new xComponent(3);
xc.ColumnsBorderStyle = BorderStyle.FixedSingle;
Controls.Add(xc);


Il costruttore, dichiarato cosi, dovrebbe creare una toolbar con tre colonne, posizionando le tre colonne in modo che occupino tutte e tre lo stesso spazio, ma sè, nel costruttore, aggiungevo altri tre parametri questi ultimi deferiranno la dimensione in percentuale occupata dalle colonne.

I problemi sono che:

1) Non mi vengono aggiunte più di due colonne, eppure controllando la lunghezza dell'array corrisponde al numero di elementi ( colonne ) che voglio, come mai ciò?

2) In ogni caso, la dimensione delle colonne non è corretta, sbaglio qualche calcolo, se se come dovrà essere?
Ultima modifica effettuata da Sevenjeak 14/03/17 8:48
aaa
14/03/17 13:53
Thejuster
Il codice sbagliato è sicuramente il tuo calcolo.

Ho eliminato un pò di roba inutile.

PS:
Ricorda che all'inizio dopo che il controllo viene disegnato, viene automaticamente innescato
il metodo resize per portare il Form ad una certa dimensione specificata nell'IDE
quindi è sempre Fondamentale! eseguire un override anche sul metodo resize
e ridisegnare il controlo non diventa un optional ma un obbligo.

Ho eliminato anche il parametro percent_size perché se il controllo è in Dock
è praticamente inutile avere una percentuale relativa alla dimensione.

Ti mostro velocemente la mia correzione poi puoi aggiustarla come meglio ti pare

public partial class xComponent : ContainerControl
    {

        public xComponent()
        {
            this.columnsBorderStyle = BorderStyle.FixedSingle;
        }
    
        private List<Panel> columns = null;
        private BorderStyle columnsBorderStyle = BorderStyle.None;
 
     
 
        public xComponent(int num_columns, params int[] percentSize)
        {
            Dock = DockStyle.Top;
            BackColor = Color.FromArgb(230, 230, 230);
            Size = new Size(968, 30);
         
            columns = new List<Panel>();
 
            // Add columns into the control
            for (int i = 0; i < num_columns; i++)
            {
                columns.Add(new Panel() { BorderStyle = BorderStyle.FixedSingle});
                columns[i].Height = Height;
                Controls.Add(columns[i]);
            }
 
            positionColumns(num_columns/*, percentSize*/);
        }
 
        public Panel Column(int index)
        {
            return columns[index];
        }
 
        private void positionColumns(int num_columns/*, int[] percentSize*/)
        {

             //Tuo Calcolo
            /*for (int i = 0; i < num_columns; i++)
            {
                columns[i].Left = (i > 0) ? columns[i - 1].Width : 0;
                columns[i].Width = (percentSize.Length == 0) ? Width / num_columns : (Width * percentSize[i]) / 100;
            }*/

            //Mio Calcolo
            int step = Width / num_columns;

            for (int i = 0; i < num_columns; i++)
            {
                columns[i].Left = step * i;
                columns[i].Width = Width / num_columns;
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.DrawRectangle(Pens.Black, new Rectangle(e.ClipRectangle.X,e.ClipRectangle.Y,e.ClipRectangle.Width-1,e.ClipRectangle.Height-1));
        }


        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);

            try
            {
                positionColumns(columns.Count);
            }
            catch { }

            Invalidate();
        }


In alternativa puoi usare il resto della larghezza per le colonne

columns[i].Width = Width % num_columns;
ti ho solo mostrato ciò che dovevi sapere ora tocca a te procedere
Ultima modifica effettuata da Thejuster 14/03/17 14:03
mire.forumfree.it/ - Mire Engine
C# UI Designer
14/03/17 19:04
Sevenjeak
Ho provato il tuo codice, le colonne me le inserisce tutte, tranne un piccolo spazio vuoto che mi lascia dopo l'ultima colonna.

Però non era ciò che volevo, non so se si è capito dal mio messaggio precedente, ma l'array percentSize si riferiva alla dimensione in percentuale dei panelli inseriti all'interno del componente, cosa centra che il componente è già  posizionato? l'avevo inserita per far si che l'utente decidesse che se ad esempio voleva impostale la colonna ( i panelle all'interno del controllo, no il controllo stesso ) centrare più grosso ( ad esempio il primo panello e il terso panello occupano il 10% della dimensione totale del contenitore, mentre il secondo, quello posizionato al centro tra i due, occupi il restante.

Hai presente, che nel controllo TableLayoutPanel c'è la possibilità di decidere la dimensione in percentuale di ogni singola colonna? ecco, io con percentSize gli vorrei dire quello, la dimensione di ogni singola colonna

Non ho capito la necessità  del metodo OnPaint() obbligatorio da dichiarare, in questo caso il metodo non viene direttamente ereditato dalla classe padre, la classe controlContainer?

Avevo pensato anche io a inserire il metodo OnResize(), ma pensando al fatto di provare il codice senza ridimensionare il form, visto che l'evento onResize() si verifica al ridimensionamento degli oggetti, ho pensato di inserirlo dopo aver provato tutto il codice, ma a quanto pare mi sbagliavo.
Ultima modifica effettuata da Sevenjeak 15/03/17 8:38
aaa