2017-01-18 11 views
0

ビジュアルスタジオでボタンを押すと、ListBoxの内容がテキストファイルに追加されるプログラムを作成しようとしています。StringBuilderを使用してリストボックスの内容をテキストファイルに追加する

私は現在、StringBuilderを使用しています。私の教授がこれが最も簡単で簡単な方法だと教えてくれたからです。私はStreamWriterも使用できることを知っています。

Dim CreateReciept As New System.Text.StringBuilder 

CreateReciet.Append(lstOrderForm.Text & vbCrLf) 

System.IO.File.WriteAllText("order_receipt.txt", Text.ToString()) 

Process.Start("order_receipt.txt") 

これは現在のコードです。しかし、私はそれを実行すると、それはリストボックスの内容ではなく空白のフォームを生成します。

+0

さて、あなたは変数(または私は推測制御)の内容をoutputingされている1つの事のテキストのために、文字列ビルダー(3行目の2番目のパラメーター)ではなくそれに何かがある場合を除き、結果として空のファイルが得られます。 –

+1

また、stringbuilderを使用すると、効率的な方法で複数の部分を含む文字列を作成できます(単純に文字列に追加すると、新しい文字列オブジェクトを作成するたびに非効率になります)。上のコードでは、単一の項目だけを追加しているので、何も役に立ちません。文字列を使用するか、値をインラインで入力することもできます。 –

+0

ありがとうKevin、なぜ空白のファイルがありますか?私はStreamWriterを使用するように切り替えるつもりですが、なぜ空白のテキストファイルを取得していますか? –

答えて

1

あなたは間違って見ていますもの。このプロパティの値は、文字列値に設定されている場合、指定されたテキストに一致する項目を選択し、リストボックス内の項目のために、リストボックスの検索を

ListBox.Textは現在選択されている項目のテキストを提供します。また、このプロパティを使用して、ListBoxで現在選択されている項目を判断することもできます。 ListBoxのSelectionModeプロパティがSelectionMode.MultiExtendedに設定されている場合、このプロパティは最初に選択されたアイテムのテキストを返します。 ListBoxのSelectionModeプロパティがSelectionMode.Noneに設定されていない場合、このプロパティは最初に選択した項目のテキストを返します。 ListBox.Itemsコレクションを

代わりにループ:

このプロパティは、現在のListBoxに格納されている項目のリストへの参照を取得することができます。このリファレンスでは、アイテムを追加したり、アイテムを削除したり、コレクション内のアイテムの数を取得したりすることができます。アイテムコレクションで実行できるタスクの詳細については、ListBox.ObjectCollectionクラスの参照トピックを参照してください。

最後にText.ToStringを使用しないと動作しません。代わりにあなたのStringBuilderを使用します。

Dim sb As New StringBuilder 

For Each item In lstOrderForm.Items 
    sb.Append(item.ToString() & vbCrLf) 
Next 

System.IO.File.WriteAllText("order_receipt.txt", sb.ToString()) 

Process.Start("order_receipt.txt") 

コードは、私のために次の出力を生成します。

enter image description here

+2

絶対パスがないと、ファイルはアプリケーションの現在のディレクトリに作成されます。これは、他に何も変更されていない場合、EXEが存在する可能性があります。これは、ユーザーが達成しようとしていることが、彼自身が行っているすべてのことが、自分のプロセスでそれを見ているからだ。それは確かに少し不安定ですが、 –

+0

@ KevinO'Donovanはそれに感謝します、あなたは正しいです。この問題は、アイテムをループせず、 'StringBuilder'を正しく使用しないことにつながりそうです。 – Bugs

0

代わりに以下のことを試してみてください。

Dim CreateReciet As New System.Text.StringBuilder 

CreateReciet.Append(lstOrderForm.Text & vbCrLf) 

System.IO.File.WriteAllText("order_receipt.txt", CreateReciet.ToString()) 

Process.Start("order_receipt.txt") 

私も、あなたのStringBuilderが有用何もしていないので、あなただけ書くことができる上に述べたよう:

System.IO.File.WriteAllText("order_receipt.txt", lstOrderForm.Text & vbCrLf) 
Process.Start("order_receipt.txt") 
+0

私はネイティブリストボックスを頻繁に使用しないので、Textプロパティがあなたが望むことをしているかどうかはわかりません。この時点でまだ期待していることが得られない場合は、リストボックスのアイテムをループして、それぞれを追加する必要があります。あなたがそれをしていたら、あなたのstringbuilderは意味をなさないでしょう –

+1

私はListBoxドキュメントをチェックしてListBox.Textはあなたがしたいことを間違いなくします - "ListBoxで現在選択されている項目のテキストを取得または検索します"。たった1つの項目のテキストを返します。したがって、アイテムをループする必要があります。詳細については、Jinx88909の答えを見てください。間違いなく、これはあなたの教授がリストボックスの使用を提案した理由です! –

+0

ありがとうKevin、私はあなた自身が 'ListBox.Text'に関してコメントしたことを理解していなかったので、ドキュメントへのリンクを提供しました。面白いのは本当に私は 'ListBox.Text'プロパティを使用せず、代わりに' ListBox.SelectedItem'の方に傾いています。 – Bugs

関連する問題