2017-04-05 20 views
0

私は現在チャットプログラムに取り組んでおり、そのアイデアは秘密のものにすることです(Facebookのようなものは秘密のチャット機能を持っています)。時間の経過とともにlistBoxから項目を削除する - C#;

私のメッセージはlistBoxコンポーネントに送信され、私はすべての10または「n」を秒最も古いメッセージが削除になるだろうことを望みます。私は はすべてのメッセージをインデックスでマークしようとしましたが、それがどのように機能するかはよく分かりませんでした。多分皆さんは、機能を知っているか、私はちょうどそれを行うものを書く際に役立つことができれば、私は聞いてるのよ何

。私はVisual Studio 2015 Windowsフォーム、C#を使用しています。あなたはListBoxを持っている場合、それは、オブジェクトのコレクション(オブジェクトの配列)ですので、

+1

これまでに何を試しましたか?私たちにいくつかのコードを提供してください、そして、私たちはそれを改善するのに役立ちます。 –

+0

winformタグを追加してください。 – qxg

答えて

0

まあ、アイテムはすべてインデックス化されています。 0から始まり、新しいエントリがある場合は上に移動します。

それでは、あなたがしなければならないだろうすべては、インデックス0(最も古いエントリ)各にある項目を削除し、バックグラウンドで実行スレッドを作成することです我々はListBox

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

に3つの項目を追加しましょう時間。 C#のWinFormsで

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

のListBoxはObjectCollection(msdn-link)ですListBoxItemsが含まれてい

だから、あなたが好きな任意のオブジェクトを追加することができ、表示されるメッセージは、のためにそう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

あなたはこれについて考えているか分かりませんが、ここでこの作業を達成できる方法があります。

まずフォーム

using System.Collections; 

でコレクションを含める必要がありますリスト機能を使用するにはList

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

を作成今トリッキーな部分です。

まず静的整数変数をグローバルに、つまりすべてのクラスの外側に宣言します。

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'の最後の項目を削除するだけではなく、リストボックスに変更が反映されますか?本当に再描画のためにアイテムリストを補充する必要がありますか? –