2011-02-27 35 views
1
private void sessionText() 
     { 
      try 
      { 
       System.IO.TextReader r = new System.IO.StreamReader("saved.txt"); 
       this.textBox1.Text = r.ReadLine(); 
       r.Close(); 
      } 
      catch (Exception x) 
      { 
       MessageBox.Show("Exception " +x); 
      } 
     } 

它將行讀入textBox1,但現在我正在擴展我的應用程序。我添加了5個更多的文本框,現在我試圖加載每行保存的數據。我怎樣才能加載每一行到下一個文本框?逐行將數據加載到每個文本框中

Line 0 -> textBox1 
Line 1 -> textBox2 
Line 2 -> textBox3 

回答

3

如果你不希望這是一個通用的方法,然後簡單地再次調用ReadLine方法和結果分配給textBox2.Text等:

private void sessionText() 
    { 
     try 
     { 
      using (System.IO.TextReader r = new System.IO.StreamReader("saved.txt")) 
      { 
       this.textBox1.Text = r.ReadLine(); 
       this.textBox2.Text = r.ReadLine(); 
       this.textBox3.Text = r.ReadLine(); 
      } 
     } 
     catch (Exception x) 
     { 
      MessageBox.Show("Exception " +x); 
     } 
    } 

注意,應該的TextReader被處置。那就是你需要調用它的Close()或Dispose()方法,因爲它是一個IDisposable。實際上,任何實現了IDisposable接口的對象都必須進行處理。

您通常使用「using」構造來完成此操作。但是,在你的情況,因爲你也有一個try-catch,你可以做這樣的:

private void button1_Click(object sender, EventArgs e) 
{ 
    System.IO.TextReader reader = null;  
    try 
    { 
    reader = new System.IO.StreamReader("saved.txt"); 
    textBox1.Text = reader.ReadLine(); 
    textBox2.Text = reader.ReadLine(); 
    textBox3.Text = reader.ReadLine(); 
    } 
    catch (Exception x) 
    { 
    MessageBox.Show("Exception " + x); 
    } 
    finally 
    { 
    if (reader != null) 
     reader.Close(); 
    } 
} 

有你這段代碼使得雖然一個假設。通過這段代碼,我指的是我列出的所有代碼以及您列出的代碼,也就是說,您正在閱讀的文件中保證有3行文本。不是這種情況可能總是如此(在你的情況下,但你可能希望看到更加防禦性的方法來處理這種事情)

另外,你已經必須修改2行和1個文本框中的代碼到3行和3個文本框,也許是時候看看如何在下一次(當你的需求從3到10)時,你不需要修改你的代碼,而是讓它知道(一些如何)關於額外的文本框,它應該做正確的事情?或者也許你的應用程序中有一些知道「行」(無論它們表示)的數量,你可以使用這些信息?

只是一個想法。

1

試試這個代碼

using (StreamReader sr = new StreamReader(@"saved.txt")) 
{ 
    string[] inputData = sr.ReadToEnd().Split(new string[] { "\n","\r","\n\r" }, 
     StringSplitOptions.RemoveEmptyEntries); 
    var textboxes = (from Control textbox in this.Controls 
         where textbox is TextBox 
         select textbox).ToArray(); 
    for (int i = 0; i < textboxes.Count(); i++) 
    { 
     textboxes[i].Text = inputData[i]; 
    } 
} 
0

像Anuraj,建議者,最好的辦法是創建文本框的數組,並填補他們與每一個線使用週期readed。 但他的建議暗示LinQ選擇以您想要的確切順序返回文本框。也許有幾次嘗試,你可以做到這一點。形式的_Load 準備數組::

嘗試此

Texts = new TextBox[10]; 
Texts[0] = txtBox1; 
Texts[1] = txtBox2; 

等等。

之後,你可以在一個週期中讀出一行行和分配給文本[CNT]

這也是一個workaroud .NET除去VB6的索引屬性之後,使得建立一個控制陣列。

相關問題