2017-04-05 27 views
0

我目前正在開發一個聊天程序,想法是讓它成爲一個祕密(有點像Facebook有祕密聊天功能)。隨着時間的推移從列表框中刪除項目 - C#;

我的郵件被髮送到listBox組件,我希望每10或'n'秒鐘最舊的郵件將被刪除。我 試圖用索引標記每條消息,但不太明白這是如何工作的。

我在問,也許你們知道一個功能,或者可以幫助我寫一個能夠做到這一點的功能。我正在使用Visual Studio 2015 Windows窗體,C#。

+1

你到目前爲止嘗試過什麼?請提供一些代碼,然後我們可以嘗試幫助您改進它。 –

+0

請添加winform標籤。 – qxg

回答

0

那麼,當你有一個ListBox,這些項目都是索引的,因爲它是一個對象集合(一個對象數組)。從0開始並向上搜索新條目。

所以我們可以說,我們增加3項我們ListBox

listBox1.Items.Add("Item 1"); //Index 0 
listBox1.Items.Add("Item 2"); //Index 1 
listBox1.Items.Add("Item 3"); //Index 2 

所有你必須做的,是建立在,在指數0(最老的條目),每個刪除的項目後臺運行一個線程時間。

new Thread(() => 
{ 
    while(true) 
    { 
     if(listBox1.Items.Count > 0) //Can't remove any items if we don't have any. 
     { 
      Invoke(new MethodInvoker(() => listBox1.Items.RemoveAt(0))); //Remove item at index 0. 
      //Needs invoking since we're accessing 'listBox1' from a separate thread. 
     } 
     Thread.Sleep(10000); //Wait 10 seconds. 
    } 
}).Start(); //Spawn our thread that runs in the background. 
1

在C#中的WinForms一個ListBox包含ListBoxItems這是一個ObjectCollection(msdn-link

所以,你可以添加任何你喜歡的對象,這將顯示來自將DisplayMember

所以對於消息示例

public class MyMessage { 
    public DateTime Received { get; set; } 
    public string Message { get; set; } 
    public string DisplayString 
    { 
     get { return this.ToString(); } 
    } 
    public string ToString() { 
     return "[" + Received.ToShortTimeString() + "] " + Message; 
    } 
} 

可以作爲ListBoxItem添加。

將DisplayMember設置爲"DisplayString"more here)會爲您提供正確的輸出。

現在您可以遍歷ListBoxItems,將它們轉換爲MyMessage並檢查它們的接收時間。

0

我不知道你是否想過這個,但是這裏有一種方法可以實現這個任務。

首先創建一個Liststrings

List<string> list1 = new List<string>(); 

要使用列表功能,你將不得不在表單中

using System.Collections; 

收藏現在到了棘手的部分。

首先在全局聲明一個靜態整數變量,即在所有類之外。

static int a; 

每當你收到一條消息(考慮您的郵件將在字符串格式),你已經到字符串添加到您創建list1

list1.Add("the received message");  

現在你已經聲明瞭一個計時器(如果你是新手,請看看計時器是如何工作的)。Windows窗體已經有了定時器,使用它會更好。 計時器在所需的時間後發送一個Tick事件。

private void timer1_Tick(object sender, EventArgs e) 
    { 
     a = list1.Count() - 1; //Count will return the number of items in the list, you subtract 1 because the indexes start from 0 
     list1.RemoveAt(a); 
     listBox.Items.Clear(); 
     foreach(string x in list1) 
     { 
       listBox.Items.Add(x); 
     } 
    } 

這段代碼要做的是,在timer的每Tick event這將刷新列表框,從數組中刪除最後一個元素,並補充,其餘的列表框中。

要使用計時器只需將其拖放到窗體上即可。這都是基於GUI的,很容易理解。

讓我知道你是否懷疑。

提示:儘量使用try{} & catch{}塊以避免應用程序崩潰。

+0

根據'listBox'中項目的順序,你可能想要使用'listBox.Items.Append'或'.Insert'。與foreach相比,節省了一些時間,重新創建了整個列表。 –

+0

@MarkusDeibel它可以節省時間,但這不是要求。列表框需要被清除,然後在沒有最後一條消息的情況下重新填充。你的意思是別的嗎? –

+0

您是否可以不刪除'Items'中的最後一個項目,並且列表框會反映更改?你真的需要重新填寫物品清單以便重新繪製嗎? –