none
如何使用c# listbox保持只跟新100筆資料 RRS feed

  • 問題

  • 我想讓listbox 維持最新的100筆資料 要如何刪除前面的資料讓資料保持在最新的100筆資料

    每筆進來的資料我想畫成圖 

     unsafe private void timer_rec_Tick(object sender, EventArgs e)
            {
                UInt32 res = new UInt32();
    
                res = VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], MAX_CAN_OBJ_ARRAY_LEN, 1000);//接受區塊 給入所有 類型索引號.....給入m_recobj[],長度1000,waiting time=100
    
                if(res>= MAX_CAN_OBJ_ARRAY_LEN)     // Must be something wrong 整組資料大於1000代表有問題
                { 
                    timer_rec.Enabled = false;
                    VCI_ResetCAN(m_devtype, m_devind, m_canind);
                    VCI_CloseDevice(m_devtype, m_devind);
                    Update_TextBox_Connection_Message_Text(E_CONNECTION_MSG_STATE.CHECK_CONNECTION);
                    buttonConnect.Text = "Connect";
                    m_bOpen = 0;
                    return;
                }
                
    
                uint ID=0, DLC=0;
                const int DATA_LEN = 8;//8位元
                byte[] DATA = new byte[DATA_LEN];//新的類別
    
                String str;
                for (UInt32 i = 0; i < res; i++)
                {
                    str = "";
                    if (m_recobj[i].ExternFlag == 0)//擴展為0則為標準形式
                    {
                        str += "Base-format ";
                    }
                    else
                    {
                        str += "Extended-format ";
                    }
                    if (m_recobj[i].RemoteFlag == 0)//remote為0則為標準形式
                    {
                        str += "data-frame ";
                    }
                    else
                    {
                        str += "remote-frame ";
                    }
    
                    str += " ID:0x" + System.Convert.ToString(m_recobj[i].ID, 16) +" ";//str將id data加入資料中
                    ID = m_recobj[i].ID;
    
                    if (m_recobj[i].RemoteFlag == 0)
                    {
                        byte len = (byte)(m_recobj[i].DataLen % 9);//
                        DLC = len;
    
                        str += "Data:";
    
                        fixed (VCI_CAN_OBJ* m_recobj1 = &m_recobj[i])
                        {
                            byte j = 0;
                            while ((j<len)&&(j<DATA_LEN))
                            {
                                DATA[j] = m_recobj1->Data[j];//data從右到左填滿1 21 321 4321.....
                                str += " " + System.Convert.ToString(DATA[j], 16);//將DATA轉成16進制
                                j++;
                            }
                        }
    
                        CAN_Update_DashBoard(ID, DLC, DATA);//給入id 長度 數據
                    }
                    listBox_Info.Items.Add(str);//將str加入 listbox 顯示區
                    
                    /*if (listBox_Info.Items.Count==10) {
                        listBox_Info.Items.RemoveAt(1);
                    }*/
                    listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1;
    
    
                }
            }

    2020年3月27日 上午 06:25

所有回覆

  • 通常我不直接用 Items.Add 把項目加進 ListBox,而是用 ListBox.DataSource 將資料繫結起來。

    可以考慮用 BindingList<T> 當作來源,接著你就是對著 BindingList<T> 新增刪除就好。

    範例:

      public partial class Form1 : Form
      {
          private BindingList<string> data;   
          private int count;
          public Form1()
          {
              InitializeComponent();
              data = new BindingList<string>();   
              listBox1.DataSource = data; 
              
          }
    
          private void button1_Click(object sender, EventArgs e)
          {
              data.Add(count.ToString());
              count++;
              if (data.Count > 10)
              {
                  data.RemoveAt(0);
              }
          }      
      }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月27日 下午 12:27
    版主