逐行将数据加载到每个文本框中

时间:2011-02-27 07:12:56

标签: c#

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个textBoxes,现在我正在尝试逐行加载每个保存的数据。如何将每一行加载到下一个文本框中?

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

3 个答案:

答案 0 :(得分: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应该是Disposed。那就是你需要调用它的Close()或Dispose()方法,因为它是一个IDisposable。实际上,必须处理任何实现IDisposable接口的对象。

通常使用“using”构造来执行此操作。但在你的情况下,因为你也有一个尝试捕获,你可以这样做:

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 :(得分: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];
    }
}

答案 2 :(得分:0)

与Anuraj一样,建议者,最好的方法是创建一个textBoxes数组,并用每个循环使用的行填充它们。 但他的建议暗示LinQ选择以您想要的确切顺序返回textBoxes。也许有几次尝试你可以做到。

试试这个: 在表单的_Load中准备数组:

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

等等。

之后,您可以在一个循环中逐行阅读并分配给文本[cnt]

在.NET删除VB6的Index属性以创建控件数组之后,这也是一个工作区。