2013-03-08 64 views
0

概念性問題: 我在後臺有時會輸出一些對象的服務,所以我想在GUI中向用戶顯示輸出。我應該使用哪種控制? Listview,因爲每個處理過的項目會有一行罰款,或者Textbox輸出?限制輸出到最新記錄,如何?

我應該從服務中保留哪些物品?在隊列中?但是,我怎樣才能輕鬆地將它綁定到控件上,以便最老的被刪除(FIFO)?任何優雅的想法如何最好地實現這一點?

+0

鑑於有限的信息,我不明白任何選擇都不如下一個任意選擇。投票結束。 – 2013-03-08 14:20:13

+1

而不是關閉這個,@Rolf,從概念中拉出一些東西:服務如何將對象發送到UI程序(直接交叉線程通信,文件,數據庫等),它只是字符串數據正在使用等? – Tory 2013-03-08 14:28:34

+0

好吧,我想我會運行一個BackGroundWorkerThread(或其他線程)來偵聽來自db的通知。這將對變更做一些工作。從處理的數據中,我將創建一個包含日期,狀態和一些文本等字段的通知對象。這個通知對象最終會顯示在GUI上(一個字符串,幾列,還不確定),我想Invoke會這樣做。主要的是我不斷地收到通知,但我只想顯示最新的通知(FIFO)並綁定控制,其他所有內容都在日誌中。達到此目的的最佳方法是什麼? – Rolfi 2013-03-08 15:03:35

回答

0

我只是添加我的解決方案,很好地工作:

public class SlidingBuffer<T> : IEnumerable<T> 
{ 
private readonly Queue<T> _queue; 

public int QueueMax { get; private set; } 

public SlidingBuffer(int maxCount) 
{ 
    QueueMax = maxCount; 
    _queue = new Queue<T>(maxCount); 
} 

public void Add(T item) 
{ 
    if (_queue.Count >= QueueMax) 
    { 
     _queue.Dequeue(); 
    } 
    _queue.Enqueue(item); 
} 

public IEnumerator<T> GetEnumerator() 
{ 
    return _queue.GetEnumerator(); 
} 

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 
} 

而且類綁定到ListBox中的項目

public class SlidingItem 
{ 
public SlidingItem(string text, int number) 
{ 
    Text = text; 
    Number = number; 
    TimeStamp = DateTime.Now; 
    Id = ++ItemsProcessed; 
} 

private static int _itemsProcessed; 

public int ItemsProcessed 
{ 
    get { return _itemsProcessed; } 
    set { _itemsProcessed = value; } 
} 

public int Id { get; set; } 

public string Text { get; set; } 

public int Number { get; set; } 

public DateTime TimeStamp { get; set; } 

public string ShowMembers() 
{ 
    return string.Format("{0}\t{1}\t{2}\t{3}", TimeStamp.ToString("G", CultureInfo.CurrentCulture), Number, Text, Id); 
} 

public override string ToString() 
{ 
    return ShowMembers(); 
} 
} 

最後:

BindingSource bindingSource = new BindingSource(); 
bindingSource.DataSource = _controller.SlidingBuffer; 
listBoxOutput.DataSource = bindingSource; 
listBoxOutput.DisplayMember = "ShowMembers";