2

我在一个方法中有这个代码,我每秒在一个计时器中调用该方法:

data = new List<string>();
data.Add("Gpu Temeprature --- " + sensor.Value.ToString());
listBox1.DataSource = null;
listBox1.DataSource = data;
listBox1.Invalidate();

它首先每秒更新列表框中的一个值作为一个项目。现在我想在第二行添加一个新项目,这样它们都会每秒更新一次,所以在计时器事件中我调用另一个方法,里面有这个代码:

// data = new List<string>();
data.Add("Cpu Temeprature --- " + sensor.Value.ToString());
listBox1.DataSource = null;
listBox1.DataSource = data;
listBox1.Invalidate();

如果我将使用 data = new List(); 在第二种方法中,它将两个项目放在列表框中的相同位置。如果我不使用此数据 = new List(); 然后第二个会一直闪烁,每一秒都会闪烁,而且看起来不太好。

这是定时器事件:

private void timer2_Tick(object sender, EventArgs e)
{
    if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
    {
        soundPlay = true;
        blinking_label();
        NudgeMe();
    }
    else
    {
        soundPlay = false;
        stop_alarm = true;

    }
    cpuView();
    gpuView();
}   

cpuView() 和 gpuView() 是我在计时器中调用的两个方法,用于更新列表框。

我还有另外两个 listBox 事件:

private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = 25;
}    


private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1)
    {
    }
    else
    {
        ColorText.ColorListBox(data, e);
    }
}

ColorText 是在一个新的类中,我在其中删除了列表框中的项目。

4

1 回答 1

2

如果您想继续这样做,您可以执行以下操作:

尝试将数据初始化、数据源和失效移到这些功能块之外,如下所示:

private void timer2_Tick(object sender, EventArgs e)
        {
            if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
            {
                soundPlay = true;
                blinking_label();
                NudgeMe();
            }
            else
            {
                soundPlay = false;
                stop_alarm = true;

            }
            data = new List<string>();
            cpuView();
            gpuView();
            listBox1.DataSource = data;
            listBox1.Invalidate();
        } 

并将它们从功能中删除,这样您就不会重复执行两次。


这可能可以使用 BindingList 更有效地完成。将数据更改为:BindingList Data = new BindingList();

然后,您永远不需要创建新列表。将所需的两个值添加到此绑定列表中,然后设置 listbox.DataSource = bindinglist。然后在您的 GPU/CPU 函数中,您只需要更新列表 IE 的索引:

数据[0] = "CPU 温度 --- " + sensor.Value.ToString());

并且 bindinglist 应该处理更新列表框。

于 2013-03-08T07:07:27.143 回答