2017-03-21 39 views
2

我希望我的ListBox能夠用新值更新舊值,而不是像現在這樣簡單地向ListBox添加更多行。但是,我不確定在哪裏尋找可以處理這個問題的東西。使用新的COM端口數據更新列表框

我當前的代碼如下所示:

private void DisplayText(string rawData) 
{ 
    textArduinoData.Text = rawData; 
    string[] sortedData = rawData.Split(';'); 

    for (int i = 0; i < sortedData.Length; i++) 
    { 
     listPortData.Items.Add(sortedData[i].ToString()); 

    } 
} 

可能有人請點我在正確的方向來實現此更新的功能?任何意見將不勝感激。

回答

2

您需要管理該過程。它的概念很簡單,但取決於需要處理多少數據,它可能會很快變慢。步驟

  1. 創建一個專門令牌類,它實現到INotifyPropertyChanged

  2. ObservableCollection來自#1的類項目。可觀察集合在添加或刪除項目時通知列表框。這將允許您的代碼一次添加一個項目。 (解決了1個問題

  3. 爲了解決數據變化的下一個問題:有一個屬性命名Text,在#1的類將保持數據,提供一個屬性更改通知。

  4. 在列表框中綁定到在步驟1中創建的項目列表並指定綁定到Text。使用列表框的數據模板將允許您綁定列表實例的Text屬性。

  5. 提供啓發式/智能來讀取傳入數據,並從步驟2中查找可觀察集合中的關聯數據。發現時,將現有數據的Text屬性更改爲新,並且該列表項的綁定將相應更改。

+0

感謝您抽出評論的時間,但我最終得到它的工作,使用的BindingSource,然後使用該BindingSource的作爲數據源爲ListBox,我今天早上選中該頁面之前。 – CuriousLekgolo

+0

@CuriousLekgolo首先,無論我很高興你解決了你的問題。其次,這仍然是一個有效的答案,如果你將其標記爲答案,我不會感到生氣。 :-) – OmegaMan

0

你可以使用IndexOf方法檢查ListBox包含string,然後更新現有string(或者乾脆什麼也不做),或添加一個新的取決於你是否獲得比的默認值以外的指標-1回:

private void DisplayText(string rawData) 
{ 
    textArduinoData.Text = rawData; 
    string[] sortedData = rawData.Split(';'); 

    int index; 
    for (int i = 0; i < sortedData.Length; i++) 
    { 
     if ((index = listPortData.Items.IndexOf(sortedData[i])) == -1) 
     { 
      listPortData.Items.Add(sortedData[i]); 
     } 
    } 
}