Como atualizar os rótulos e outros controles dentro do GroupBox/Painéis dentro de um formulário em C#?
Pergunta
Estou projetando um aplicativo C# onde tenho uma caixa de grupo mostrando informações relacionadas ao sistema operacional e à RAM.Eu o projetei usando os controles - rótulos reunidos em uma caixa de grupo mostrando informações relacionadas à RAM.
Eu tenho um botão Atualizar que ao clicar deve exibir% de RAM usada atualmente.
Para isso, preciso do rótulo (e também de alguns outros rótulos) dentro do groupbox para atualize e recalcule o valor.
Como eu faço isso?Tentei tudo abaixo no evento RefreshButton_Click mas nada funciona:
label1.Refresh();
GroupBox1.Refresh();
Form1.Refresh();
Form1.Invalidate(true);
Panel1.Refresh();
Por favor, ajude nisso, pois não acho que recarregar um formulário inteiro seria uma solução eficiente.
Solução
A atualização não fará nada além de exibir o mesmo valor atribuído.Você deve definir os novos valores calculados para seus controles dentro do manipulador RefreshButton_Click:
var myNewValue = CalculateNewValue();
label1.Text = myNewValue;
Espero que ajude!
Outras dicas
Crie uma classe contendo as propriedades que você deseja exibir e implemente o INotifyPropertyChanged
interface para todas as suas propriedades.Em seguida, use Data Binding para vincular seu objeto aos controles do seu formulário.Os controles serão atualizados automaticamente quando as propriedades do seu objeto forem alteradas.
Ver Usando a funcionalidade INotifyPropertyChanged ou Google INotifyPropertyChanged DataBinding WinForms c#.
No winforms você não atualiza formulários inteiros, use apenas eventos acionadores que atualizam partes dos formulários.Incluí abaixo a maneira de fazer isso.Basicamente você precisa de uma função computacional e precisa atualizar o rótulo definindo o texto com a saída dessa função.Você precisará adicionar quantas funções forem necessárias.
Em última análise, você desejará criar uma classe de cálculo, pois deseja separar sua IU de seus cálculos.
Aqui está um exemplo:
private void RefreshButton_Click(object sender, EventArgs e)
{
//Assuming label1 is for the Ram
label1.text = getRamString();
}
private string getRamString()
{
float ramValue = //Calculate the RAM
return string.Format("{0}%", ramValue);
}
A maneira mais fácil, mas não muito elegante, é fazer um loop em todos os controles na caixa de grupo desejada.Código de amostra
// Got group box control
Control[] controls = Controls.Find("groupBox1", false);
// List all elements in group box
foreach(var c in ((Control)controls[0]).Controls)
{
// Update in case it is label
if( c.GetType().ToString().EndsWith("Label") )
{
((Label)c).Text = "label...";
}
}