私にとっては建築上の挑戦のように聞こえます。
キューを使用することをお勧めします。これは、先入れ先出し(FIFO)アプローチに従ったコレクションタイプです。オブジェクトをキューに入れて、同じ順序で戻します。このキューから受信されたオブジェクトは自動的にキューから削除されるため、同じ要素を2回処理しないようにすることができます。
説明したワークフローは、次の簡単な手順で機能します。
- メッセージが到着するたびに、オブジェクトをキューに入れます。
- 管理者がをクリックすると、キューから
next button
最初のオブジェクトを要求します。
- 管理者は管理タスクを実行し、メッセージを承認します。
Next
上記の項目1からもう一度クリックします。
[編集]
おっと、私のQueue
アプローチでは前のアイテムに戻ることができないことに気づきました。
この場合、単純なList
コレクションを使用することをお勧めします。このリストには、リスト内の0から始まる位置からアクセスできます。これにより、前方/後方ナビゲーションの実装が容易になります。
私のサンプルコードについては、あなたの環境について私が知ることができないことがたくさんあることを覚えておいてください、それで私のコードはここで多くの仮定をします。
承認されるメッセージを含むコレクションをどこかに保存する必要があります。
private IList<videomessage> _messagesToApprove = new List<videomessage>();
コレクション内の現在の位置を追跡する変数も必要になります。
// Store the index of the current message
// Initial value depends on your environment. :-)
private int _currentIndex = 0;
まず、イベントのサブスクライブなど、そのコレクションに新しいメッセージを追加する開始点が必要になります。メッセージが到着したら、次のようなメソッドを呼び出してコレクションに追加します。
// I made this method up because I do not know where your messages really come from.
// => ADJUST TO YOUR NEEDS.
private void onNewMessageArriving(string messageId)
{
videomessage arrivingMessage = new videomessage(messageId);
_messagesToApprove.Add(arrivingMessage);
}
位置インデックスをインクリメント/デクリメントすることで、ナビゲーションを簡単に実装できます。
private void previous_Click(object sender, EventArgs e)
{
// Check that we do not go back further than the beginning of the list
if ((_currentIndex - 1) >= 0)
{
_currentIndex--;
this.currentMessage = this._messagesToApprove[_currentIndex];
}
else
{
// Do nothing if the position would be invalid
return;
}
}
private void next_Click(object sender, EventArgs e)
{
// Check if we have new messages to approve in our list.
if ((_currentIndex + 1) < _messagesToApprove.Count)
{
_currentIndex++;
currentMessage = _messagesToApprove[_currentIndex];
}
else
{
// Do nothing if the position would be invalid
return;
}
}
private void approve_Click(object sender, EventArgs e)
{
// Sorry, I don't know where exactly this comes from, needs to be adjusted to your environment
status.SelectedValue = "1";
this.currentMessage.status = "1";
this.currentMessage.Save();
// If you want to remove items that have been checked by the admin, delete it from the approval list.
// Otherwise remove this line :-)
this._messagesToApprove.RemoveAt(_currentIndex);
}
private void remove_Click(object sender, EventArgs e)
{
// Sorry, I don't know where exactly this comes from, needs to be adjusted to your environment
status.SelectedValue = "2";
this.currentMessage.status = "2";
this.currentMessage.Save();
// If you want to remove items that have been checked by the admin, delete it from the approval list.
// Otherwise remove this line :-)
this._messagesToApprove.RemoveAt(_currentIndex);
}