0

概念的な質問: バックグラウンドで時々いくつかのオブジェクトを出力するサービスがあるので、GUI で出力をユーザーに表示したいと考えています。どのコントロールを使用すればよいですか? リストビュー、処理されたアイテムごとに 1 行でよいので、それともテキストボックス出力ですか?

サービスからオブジェクトをどこに保管すればよいですか? キューに入っていますか? しかし、最も古いものが削除されるようにコントロールに簡単にバインドするにはどうすればよいでしょうか (FIFO)。これを最適に実装するためのエレガントなアイデアはありますか?

4

1 に答える 1

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();
}
}

そしてアイテムのあるクラス

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();
}
}

最後に ListBox にバインドします。

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = _controller.SlidingBuffer;
listBoxOutput.DataSource = bindingSource;
listBoxOutput.DisplayMember = "ShowMembers";
于 2013-07-01T05:55:00.737 に答える