Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C# .NET] Cambio temporaneo del colore di background

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB

0
voti

[1] [C# .NET] Cambio temporaneo del colore di background

Messaggioda Foto Utenteboiler » 11 giu 2018, 16:26

Ciao a tutti

In un progetto Window Forms ho un controllo di tipo TextBox.
Quando l'utente clicca sul tasto per far partire un certo processo, una funzione verifica che il contenuto di questa TextBox sia sensato.
Se non lo è viene generato un messaggio d'errore e lo sfondo del controllo diventa rosso (lo faccio per semplificare la vita all'utente perché di queste TextBox ce ne sono parecchie).

In sostanza, semplificando parecchio, ho questo (tb è il controllo in questione):

Codice: Seleziona tutto
private void system_Init()
{
   tb.TextChanged += (sender, args) => { ((TextBox) sender).BackColor = Color.White; };
}



private void bStart_Click(object sender, EventArgs e)
{
   tb.Enabled = false;

   if (tb.Text != "blablabla")
   {
      MessageBox.Show("Error", "Error");
      tb.BackColor = Color.Red;
      tb.Enabled = true;
      return;
   }

   // do something
}



In systemInit registro un evento che toglie il rosso dal campo quando il testo viene modificato.
Il problema si presenta quando l'utente immette un testo che non viene accettato: il campo diventa rosso, riceve il messaggio d'errore, poi lo corregge e preme una seconda volta su "Start". A questo punto il campo viene validato correttamente, ma resta bianco, non diventa grigio come si ci aspetterebbe da un TextBox la cui proprietà Enabled è falsa.

Ho anche provato a usare
Codice: Seleziona tutto
tb.TextChanged += (sender, args) => { ((TextBox) sender).BackColor = TextBox.DefaultBackColor; };

Ma ottengo un risultato simile.

Riassumendo: se cambio il colore del controllo, questo diventa statico e non segue piú i default di sistema quando lo si abilita o disabilita.

Pensavo fosse un errore ricorrente e banale, ma con Google con ho trovato nulla di simile.
Qualcuno ha un'idea?
Avatar utente
Foto Utenteboiler
12,9k 4 6 13
G.Master EY
G.Master EY
 
Messaggi: 2170
Iscritto il: 9 nov 2011, 12:27

1
voti

[2] Re: [C# .NET] Cambio temporaneo del colore di background

Messaggioda Foto Utentevenexian » 12 giu 2018, 0:10

E' vero! Non lo avevo mai notato...

Io ho risolto così:
1) Creo un oggetto al quale assegno il colore di sfondo della TextBox, prima di modificarlo.
2) Lo modifico a piacimento.
3) Lo ripristino assegnando come colore l'oggetto di cui al punto 1.

Provato, funziona.
Immagine
Avatar utente
Foto Utentevenexian
4.211 1 4 6
Master EY
Master EY
 
Messaggi: 1318
Iscritto il: 13 mag 2017, 10:07
Località: Venezia (ma va?)

0
voti

[3] Re: [C# .NET] Cambio temporaneo del colore di background

Messaggioda Foto Utenteboiler » 12 giu 2018, 17:50

Mmmhhh, a me non funziona.

Prova a far partire questo metodo attaccandolo ad un bottone (tb è la TextBox):
Codice: Seleziona tutto
private void button1_Click(object sender, EventArgs e)
      {
         TextBox banana = new TextBox();
         banana.BackColor = tb.BackColor;

         tb.BackColor = Color.Red;

         this.Invalidate();
         this.Update();
         this.Refresh();
         Application.DoEvents();

         System.Threading.Thread.Sleep(1000);
         tb.BackColor = banana.BackColor;

         this.Invalidate();
         this.Update();
         this.Refresh();
         Application.DoEvents();

         System.Threading.Thread.Sleep(1000);
         tb.Enabled = false;

         this.Invalidate();
         this.Update();
         this.Refresh();
         Application.DoEvents();

      }


Alla fine lo sfondo della TextBox è bianco, mentre -essendo disabilitata- me lo aspetterei grigio.

Ad ogni modo oggi ho parlato con il nostro software engineer che casualmente era qui... la soluzione è molto semplice (come sempre, quando la si conosce #-o ):

Codice: Seleziona tutto
tb.BackColor = Color.Empty;


Saluti, Boiler
Avatar utente
Foto Utenteboiler
12,9k 4 6 13
G.Master EY
G.Master EY
 
Messaggi: 2170
Iscritto il: 9 nov 2011, 12:27

0
voti

[4] Re: [C# .NET] Cambio temporaneo del colore di background

Messaggioda Foto Utentevenexian » 12 giu 2018, 18:21

E' strano che il tuo esempio non funzioni (a me proprio non va, non fa nulla) ...

Qui c'è il codice del mio: due coppie di pulsanti, una per il cambio del colore rosso/bianco, una per la condizione della textbox enabled/disabled. Funziona.

TestC#.png
TestC#.png (2.81 KiB) Osservato 104 volte


Codice: Seleziona tutto
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TBD
{
    public partial class Form1 : Form
    {
        Color baseColor;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            baseColor = textBox1.BackColor;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Enabled = false;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Enabled = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.BackColor = Color.Red;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.BackColor = baseColor;
        }
    }
}

Ho provato anche con il colore Color.Empty e funziona anche senza doversi creare la propria variabile globale. Buono a sapersi.

Questo è comunque un funzionamento... anomalo di Visual Studio: la textbox appena creata mostra come colore 'Windows' che non è un colore. Non mostra invece 'Empty' come dovrebbe. :?
Immagine
Avatar utente
Foto Utentevenexian
4.211 1 4 6
Master EY
Master EY
 
Messaggi: 1318
Iscritto il: 13 mag 2017, 10:07
Località: Venezia (ma va?)

1
voti

[5] Re: [C# .NET] Cambio temporaneo del colore di background

Messaggioda Foto Utenteboiler » 13 giu 2018, 9:25

Ho ricreato qui il tuo progetto e funziona anche a me.
La differenza è che io assegnavo il colore originale alla corrispondente property di un oggetto TextBox, mentre tu lo fai in un oggetto di tipo Color.

Questo è comunque un funzionamento... anomalo di Visual Studio: la textbox appena creata mostra come colore 'Windows' che non è un colore. Non mostra invece 'Empty' come dovrebbe. :?

No, questo è corretto. Window è un colore della classe SystemColors e in sostanza dice all oggetto di prendere il colore di default che Windows prescrive per quel tipo di controllo. Sono quelli che imposti qui:
window_color_setting.PNG

(tasto destro sul Desktop --> Personalize --> Window Color)

Qui c'è il riferimento nel manuale:
https://msdn.microsoft.com/en-us/librar ... w(v=vs.110).aspx

Non mi spiego ancora appieno il comportamento differente dei due progetti di cui sopra, ma quando ho un attimo di tempo ci do un'occhiata.

Ciao, Boiler
Avatar utente
Foto Utenteboiler
12,9k 4 6 13
G.Master EY
G.Master EY
 
Messaggi: 2170
Iscritto il: 9 nov 2011, 12:27


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti