[C# WinForms] Gruparea Controalelor folosind proprietatea Tag și numere float

Pentru a calcula partea fractionara a unui numar de tip float in C#, se poate folosi, de exemplu, expresia:

x - (int)x

unde
- x este numele unei variabile de tip float;
- - este minus, operator matematic;
- (int) înseamnă că (int)x este partea întreagă a lui x;

De exemplu:

x - (int)x == 0.5F

unde

== este operatorul de verificare a egalității dintre 2 expresii;
0.5F este o expresie literală de tip float (F vine de la float) și „.” este separatorul dintre partea întreagă și cea fracțională a numărului (în lb. română acesta este , dar în C# se folosește .).


Exemplul #1

Cod sursă

float x = 1.5F;
float y = x - (int)x;
MessageBox.Show($"Partea fractionara a" +

    $" lui {x} este {y}.");

Captură de ecran


La rularea programului:

Exemplul #2

În urm. exemplu avem un container de Controale (UserControl, Form, Panel etc.) care conține mai multe Controale. Fiecare Control are o proprietate numită Tag care poate conține orice tip de obiect (string, float, tipuri valoare - struct, tipuri referință - class). În acest ex. atribuim proprietății Tag a tuturor Controalelor dintr-un container câte un nr. float, apoi traversăm colecția de controale Controls (sau this.Controls) și la fiecare verificăm valoarea Tag-ului: dacă partea fracționară este 0F sau 0.5F, astfel Controalele se pot grupa în mod eficient.

De exemplu:

            float tag = 1.5F; // Tag-ul transcris în tip float din designer WinForms sau din locul unde se construiește interfața grafică pentru utilizator, programatic.
            Control c = Controls[(int)tag]; // Controlul cu indicele ca partea întreagă a „tag”, variabilă care poate avea partea fracționară 0F sau 0.5F în acest exemplu, este gasit sau apare o excepție. (Controls nu se acceseaza decat prin indici numere naturale.)
            float x = tag - (int)tag; // partea fractionara a tag-ului
            if (x == 0.5F)
            {
                // ....
            }
            else if (x == 0F)
            {
                // ...
            }

Partea fractionara poate fi si 0.2F, 0.4F etc... Care valori sunt folosite depinde de caz.

Cod sursă complet (explicație dedesubt)

using System;
using System.Drawing;
using System.Windows.Forms;

namespace cs_winforms_tag_test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i += 2)
            {
                Controls.Add(new TextBox()
                {
                    Tag = (float)i,
                    Left = 10,
                    Top = 10 + i * 20,
                    Text = "Din primul set"
                });
                Controls.Add(new TextBox()
                {
                    Tag = (float)i + 0.5F,
                    Left = 10,
                    Top = 10 + (i + 1) * 20,
                    Text = "Din al doilea set"
                });
            }

            Button btn = new Button()
            {
                Text = "Colorează",
                AutoSize = true,
                Left = 150,
                Top = 10
            };
            btn.Click += Btn_Click;
            Controls.Add(btn);
        }

        private void Btn_Click(object sender, EventArgs e)
        {
            foreach (Control c in Controls)
            {
                if (c.Tag == null)
                {
                    continue;
                }

                float tag = (float)(c.Tag);
                float pFractionara = tag - (int)tag;
                if (pFractionara == 0.5F)
                {
                    c.ForeColor = Color.Blue;
                }
                else
                {
                    c.ForeColor = Color.Green;
                }
            }
        }
    }
}

Explicație

Form1_Load este handler conectat la eventul Form1.Load, Form1 fiind singurul Form din proiect. In acest handler, i trece de la 0 la 4 in pasi de lungime 2, la fiecare pas creand 2 TextBox-uri cu valoarea Tag ca un numar float cu partea fractionara fie 0, fie 0.5. Se seteaza coordonatele vizuale ale TextBox-urilor, Left si Top. Fiecare TextBox are ca Text fie "Din primul set", fie "Din al doilea set". Se creeaza in acest handler si un buton pe care cand se face clic se coloreaza textul din TextBox-uri in functie de valoarea proprietatii lor Tag.

Capturi de ecran





La rularea programului:


După clic pe butonul Colorează:

Niciun comentariu:

Trimiteți un comentariu