2017-11-13 14 views
0

プログラムがテキストファイルから読み込んでリストボックスに表示するウィンドウプログラムを作成しようとしています。私は以下のコードを試しましたが、今問題はボタンをクリックするたびに追加され、データが繰り返されることです。テキストファイルから読み込み、ボタン付きリストボックスに入力する

ファイルを読み取り、新しい入力データのみを含むようにするにはどうすればよいですか?

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    using (StreamReader sr = new StreamReader("C:\\Users\\jason\\Desktop\\Outbound.txt")) 
    { 
     string line; 
     // Read and display lines from the file until the end of 
     // the file is reached. 
     while ((line = sr.ReadLine()) != null) 
     { 
      Listbox1.Items.Add(line); 
     } 
     sr.Close(); 
    } 
} 
+4

ファイルを読む前に 'Listbox1.Items.Clear()'を一度呼び出しますか? – Clemens

+0

ボタンを使用せずにリストをリフレッシュする方法はありますか? –

+1

*リストボックスを直接変更しないでください。 WinFormsとWPFはどちらもデータバインディングをサポートしています。 WPFの機能の80%はデータバインディングに依存します。リストをリフレッシュする方法は必要ありません。データバインディングを使用する場合、WPFは自動的にそれを行います。 –

答えて

4

あなたが欲しいものを行うには、おそらく最も簡単な方法は、コレクションにファイルからすべての行を読んで、その後、あなたのListBoxのItemsSourceプロパティにそのコレクションを割り当てることです:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Listbox1.ItemsSource = File.ReadAllLines(@"C:\Users\jason\Desktop\Outbound.txt"); 
} 
0

として、 Clemensはコメントで、Listbox1.Items.Clear()またはListbox1.ItemsSource = File.ReadAllLines(@"C:\Users\jason\Desktop\Outbound.txt");
のいずれかを指定できますが、これは常にすべてのリストボックスをファイルに置き換えます。あなたが言ったように、新しいデータを入力したいだけなら、アイテムを追加する前に単にif(!Listbox1.Items.Contains(line))をチェックすることができます。
あなたが本当にしたいことに依存して、リスト全体を再アップデートまたは新しいエントリを追加して古いものを削除しないでください。

+0

'Items.Contains(line)'をチェックするだけでは不十分です。潜在的に削除された行について考えると、関連するListBox項目を削除する必要があります。 – Clemens

+0

はい、それは私が言った理由です:彼は新しいエントリを追加し、古いものを残すか、またはファイルから削除したいだけであれば、私は彼のプログラムの目的を知らないので必要になるかもしれません。彼が行動として望むものに依存する。 –

+0

しかし、おそらく私は間違って彼が意味したことを理解し、はい私の答えは彼が必要とするものではない –

関連する問題