Como atualizar os rótulos e outros controles dentro do GroupBox/Painéis dentro de um formulário em C#?

StackOverflow https://stackoverflow.com//questions/9657870

  •  11-12-2019
  •  | 
  •  

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.

Foi útil?

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...";
            }
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top