我目前正在開發一個聊天程序,想法是讓它成爲一個祕密(有點像Facebook有祕密聊天功能)。隨着時間的推移從列表框中刪除項目 - C#;
我的郵件被髮送到listBox
組件,我希望每10或'n'秒鐘最舊的郵件將被刪除。我 試圖用索引標記每條消息,但不太明白這是如何工作的。
我在問,也許你們知道一個功能,或者可以幫助我寫一個能夠做到這一點的功能。我正在使用Visual Studio 2015 Windows窗體,C#。
我目前正在開發一個聊天程序,想法是讓它成爲一個祕密(有點像Facebook有祕密聊天功能)。隨着時間的推移從列表框中刪除項目 - C#;
我的郵件被髮送到listBox
組件,我希望每10或'n'秒鐘最舊的郵件將被刪除。我 試圖用索引標記每條消息,但不太明白這是如何工作的。
我在問,也許你們知道一個功能,或者可以幫助我寫一個能夠做到這一點的功能。我正在使用Visual Studio 2015 Windows窗體,C#。
那麼,當你有一個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.
在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
並檢查它們的接收時間。
我不知道你是否想過這個,但是這裏有一種方法可以實現這個任務。
首先創建一個List
的strings
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{}
塊以避免應用程序崩潰。
根據'listBox'中項目的順序,你可能想要使用'listBox.Items.Append'或'.Insert'。與foreach相比,節省了一些時間,重新創建了整個列表。 –
@MarkusDeibel它可以節省時間,但這不是要求。列表框需要被清除,然後在沒有最後一條消息的情況下重新填充。你的意思是別的嗎? –
您是否可以不刪除'Items'中的最後一個項目,並且列表框會反映更改?你真的需要重新填寫物品清單以便重新繪製嗎? –
你到目前爲止嘗試過什麼?請提供一些代碼,然後我們可以嘗試幫助您改進它。 –
請添加winform標籤。 – qxg