1

アイテムの名前と説明を入力するプログラムを作成しています。次に、それをリストボックスに追加します。完了したら、すべてのアイテムを「txt」ファイルに保存できます。(StreamWriter を使用)。このプログラムには編集ボタンもあり、最初にリストボックスから説明を削除してからテキストボックスに戻すことで、リストボックスの説明を編集できます(したがって、編集できます)

説明が複数行の場合、リストボックスで選択して編集ボタンをクリックすると、複数行が正常に表示され、テキストボックスに表示されます。しかし、リストボックス内のすべてのアイテムを最初にファイルに保存すると. 次に、ファイルを再度開き、アイテムをリストボックスにロードします。そして、編集ボタンをクリックすると...

複数行の説明は、テキスト ボックスに 1 行の説明として表示されます。

理由はわかりませんが、テキストボックスが表示するはずの正確な文字列を表示するラベルも作成しましたが、ラベルは複数行で表示されていますが、テキストボックスはそうではありません!

文字列は間違いなく複数行ですが、StreamReader を使用して項目をリストボックスにロードした後、複数行のテキスト ボックスに 1 行で表示されます。

複数行の文字列の例: (「theString1」という名前)

これが1行目

これが2号線

次のコードを使用:TextBox1.Text = theString1;これはテキスト ボックスに表示されます。

こちらはline1 こちらはline2

しかし、同じコードをラベルで使用すると。正しく表示してくれます。

なぜこれが起こっているのか誰かが私に説明できれば、私はもっと幸せになるでしょう. 説明が必要です。 前もって感謝します。

- -[より詳しい情報] - -

ちょうどあなたが知っているので。私は自分でこのコードを思いついたので、おそらくセットアップがすべて間違っています。 これを行うためのより良い方法を教えていただければ幸いです。

リストを使用して、説明テキストとアイテム名を保存しています。'`' を使用してこれら 2 つを分離し、文字列を分割しました (コードを参照)。

これは、編集ボタンをクリックしたときに発生するコードです。リストボックスからアイテムを削除し、テキストボックスに表示して、編集してリストボックスに再度追加できるようにします。

int index = listBox.SelectedIndex;

itemName.Text = listBox.SelectedItem.ToString();

var descVar = descList.ElementAt(index).Split('`');   
string theString1 = descVar[1];  

TextBox1.Text = theString1;

ファイルに保存する方法は次のとおりです。

FileDialog save = new SaveFileDialog();
save.Title = "Save information...";
save.DefaultExt = "Text File|*.txt";
save.Filter = "Text File|*.txt";

if (save.ShowDialog() == DialogResult.OK)
{

    StreamWriter sw = new StreamWriter(save.FileName);

    foreach (string s in listBox.Items)  //This writes the names of item names.
    {
        sw.WriteLine(s);
    }

    sw.WriteLine("`1`");  //I use this to seperate the item names from description.

    foreach (string s in descList)  //This writes the descriptions that are stored in a list named "descList".
    {
        sw.WriteLine(s);
        sw.WriteLine("``");     //I use this to seperate descriptions from each other because they are multi-line.
    }
    sw.WriteLine("`2`");   //Just something so I know where it ends. :D
    sw.Close();              
}
else
{
}

そして、これがロード方法です: (これは間違いなくより良いものになる可能性があります!)

FileDialog load = new OpenFileDialog();
load.Title = "Load information...";
load.DefaultExt = "Text File|*.txt";
load.Filter = "Text File|*.txt";

if (load.ShowDialog() == DialogResult.OK)
{
    List<string> loadDesc = new List<string>();  //Don't ask you will see why
    descList.Clear();

    while (listBox.Items.Count > 0)  //This removes all items in the listbox to load new ones.
    {
        int index = 0;
        listBox.Items.RemoveAt(index);

        descList.Clear();


        itemName.Text = "";
    }  

    StreamReader rw = new StreamReader(load.FileName);
    for (; true; )  
    {
        string read = rw.ReadLine();

        if (read == "`1`")  //When it reaches the separator I made it stops reading.
        {
            break;
        }
        else
        {
            listBox.Items.Add(read);
        }
    }

    for (; true; )  
    {
        string read = rw.ReadLine();

        if (read == "`2`")
        {
            break;
        }
        else
        {
            loadDesc.Clear();
            loadDesc.Add(read);
            for (; true; )       //Please tell me if this can be done differently.
            {
                string read2 = rw.ReadLine();
                if (read2 != "``")           //This will keep reading the whole description until it reaches the separator.
                {
                    loadDesc.Add(read2);     //Adds each line into the list I created.
                }
                else
                {
                    break;
                }
            }
            string oneBigString = string.Join("\n", loadDesc);   //This basically converts all strings in a list into one string.
            descList.Add(oneBigString);                          //And this finally add the string to the main list from where it then loads.
        }
    }

}
else
{
}

それだと思います。他に必要なものがあれば、教えてください。

4

1 に答える 1

3

string oneBigString = string.Join("\n", loadDesc);問題がどこにあるかです。

Environment.NewLineの代わりに使用\n

また、コードで改善できる可能性のあるいくつかのことについても説明します(たくさんありますが、いくつか取り上げたいと思います)。

while (listBox.Items.Count > 0) //This removes all items in the listbox to load new ones.

リストボックス内のすべての要素を繰り返して削除する必要はありません。あなたはただlistBox.clear()をすることができます

また、ブレークを使用してループから抜け出すことは、一般的に悪い習慣です。これは次のように書く必要があります...

for (; true; )  
{
    string read = rw.ReadLine();

    if (read == "`1`")  //When it reaches the separator I made it stops reading.
    {
        break;
    }
    else
    {
        listBox.Items.Add(read);
    }
}

これ

string read = rw.ReadLine()
while(read != "`1`")  
{
   listBox.Items.Add(read);
   read = rw.ReadLine()
}

しかし、それ以上に1、ファイルに見つからない場合はどうなりますか?プログラムがクラッシュするので、読み取るデータがまだあるかどうかも確認する必要があります...

string read = rw.ReadLine()
while(read != "`1`" && !sw.EndOfStream)  // Make sure you're not at the end of the file
{
   listBox.Items.Add(read);
   read = rw.ReadLine()
}
于 2013-02-14T23:05:24.187 に答える