如何将listBox添加到另一个项目?

时间:2013-03-08 06:55:43

标签: c#

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

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

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

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

如果我将使用data = new List();在第二种方法中,它将两个项目放在listBox中的相同位置。 如果我不使用这个数据= 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的计时器中调用的两个方法。

我还有另外两个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位于一个新类中,我可以使用它来清理listBox中的项目。

1 个答案:

答案 0 :(得分: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的索引:

data [0] =&#34; Cpu Temeprature ---&#34; + sensor.Value.ToString());

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