2013-02-14 71 views
1

我正在製作一個程序,輸入項目的名稱及其描述。然後將其添加到列表框中,完成後,可以將所有項目保存到「txt」文件中。 (使用StreamWriter)。這個程序還有一個編輯按鈕,它允許你編輯列表框中的描述,首先從列表框中刪除它,然後在文本框中顯示它(所以你可以編輯它)多行文本框顯示多行字符串爲單行

如果描述是多線程的,當我在列表框中選擇它時,它會成功地顯示它,然後單擊將顯示在文本框中的編輯按鈕。 但是,如果我將第一個文件夾中的所有項目保存到文件。然後再次打開文件,以便將項目加載回列表框。然後單擊編輯按鈕...

多行說明將在文本框中顯示爲單行說明。

我不知道爲什麼 - 但我也製作了一個標籤,它將顯示文本框假設顯示的確切字符串,並且標籤顯示它多行,而文本框不顯示!

該字符串絕對是多行的,但多行文本框使用StreamReader將項加載回列表框後顯示爲單行。多行的字符串的

實施例:(名爲 「theString1」)

這是第1行

這是第2行

使用以下代碼:TextBox1.Text = theString1;此出現在文本框中:

This is line1 This i s line2

但是,如果我使用相同的代碼與標籤。它會正確顯示它。

如果有人能向我解釋爲什麼會發生這種情況,我會更加高興。我只需要一個解釋。 在此先感謝。

--- [詳細信息] ---

只要你知道。我自己想出了這個代碼,所以它可能是錯誤的。 如果你告訴我一個更好的方法來做到這一點,我會很高興。

我正在使用一個列表來存儲描述文本+項目名稱。我用'`'將這兩個字符分開,然後分割字符串(參見代碼)。

這是單擊編輯按鈕時發生的代碼。它從 列表框中刪除項目並將其顯示在文本框中,以便您可以編輯和添加再次列表框:

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 
{ 
} 

我相信,就是這樣。 如果您還有其他需要的東西 - 告訴我。

+3

向我們展示字符串是如何構建,如何你把它保存到文件中,以及如何'從文件 – 2013-02-14 20:01:09

+0

讀取並顯示文本框代碼,您是否添加 2013-02-14 20:05:21

+0

請不要重複標題問題標題。 – 2013-02-14 20:07:32

回答

4

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()

另外,使用break來擺脫循環通常是不好的做法。這應該寫成...

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() 
} 
+0

@AdamVeselič左側的回答頂部附近有一個白色複選標記。如果這個答案是正確的,請點擊它,使其綠色標記爲接受的答案:) – 2013-02-15 12:56:02