Как обновить Labels и другие элементы управления внутри GroupBox / Panels внутри формы в C #? - PullRequest
0 голосов
/ 11 марта 2012

Я разрабатываю приложение на C #, в котором у меня есть групповой блок с информацией об ОС и оперативной памяти. Я разработал его, используя элементы управления - метки, собранные в Groupbox, показывающие информацию, связанную с оперативной памятью.

У меня есть кнопка Обновить, которая при нажатии должна отображать% оперативной памяти, используемой в настоящее время.

Для этого мне понадобится метка (а также несколько других меток) внутри группового блока, чтобы обновить и заново вычислить значение.

Как мне это сделать? Я попробовал все ниже в событии RefreshButton_Click, но ничего не работает:

label1.Refresh(); 

GroupBox1.Refresh(); 

Form1.Refresh(); 
Form1.Invalidate(true); 

Panel1.Refresh();

Пожалуйста, помогите в этом, так как я не думаю, что перезагрузка всей формы была бы эффективным решением.

Ответы [ 4 ]

1 голос
/ 11 марта 2012

Создайте класс, содержащий свойства, которые вы хотите отобразить, и реализуйте интерфейс INotifyPropertyChanged для всех ваших свойств.Затем используйте привязку данных, чтобы привязать ваш объект к элементам управления в вашей форме.Элементы управления будут обновляться автоматически при изменении свойств вашего объекта.

См. Использование функции INotifyPropertyChanged или google INotifyPropertyChanged Привязка данных WinForms c # .

1 голос
/ 11 марта 2012

Обновление ничего не изменит, но отобразит назначенное значение. Вы должны установить новые рассчитанные значения для ваших элементов управления внутри вашего обработчика RefreshButton_Click:

var myNewValue = CalculateNewValue();
label1.Text = myNewValue;

Надеюсь, это поможет!

0 голосов
/ 11 марта 2012

Самый простой, но не слишком элегантный способ - зациклить все элементы управления в нужном групповом блоке. Пример кода

        // 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...";
            }
        }
0 голосов
/ 11 марта 2012

В winforms вы не обновляете целые формы, а просто запускаете события, которые обновляют части форм. Я включил ниже способ сделать это. В основном вам нужна вычислительная функция, и вам нужно обновить метку, установив текст с выводом этой функции. Вам нужно будет добавить столько функций, сколько необходимо.

В конечном итоге вы захотите создать класс вычислений, поскольку вы захотите отделить свой пользовательский интерфейс от своих вычислений.

Вот пример:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...