从文本文件填充TextBox

时间:2009-05-27 07:48:51

标签: c#

我试图从文件中获取特定的行并将它们放在另一个字符串中,或​​者如果我们可以将它放在另一个文本框中,它就不会是一个问题:P

string[] msglines;

msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt");

for (int x = 0; x < msglines.Length; x++)
{
    this.textBox5.Text = msglines[c];
    c = c + 2;
}

我得到了: 索引超出了数组的范围。

13 个答案:

答案 0 :(得分:7)

如果你想得到每一行。

将循环更改为

//Odd Lines
for (int x = 0; x < msglines.Length; x = x + 2)
{
    this.textBox5.Text += msglines[x];
}

//Even Lines
for (int x = 1; x < msglines.Length; x = x + 2)
{
    this.textBox5.Text += msglines[x];
}

正如评论中指出的那样,您可以将x = x + 2缩短为x += 2

为了LinqY Goodness的利益......

//ODDS
msgLines
    .Where((str, index) => index % 2 == 0)
    .ToList()
    .ForEach(str => textBox1.Text += String.Format("{0}\r\n", str));

//EVENS
msgLines
    .Where((str, index) => index % 2 == 1)
    .ToList()
    .ForEach(str => textBox1.Text += String.Format("{0}\r\n", str));

答案 1 :(得分:3)

你的循环由x控制,但是你要用c进行索引[因此你需要逻辑来防止c变得大于数组的大小]

答案 2 :(得分:3)

因为您每次都将行索引(c)增加2;只需使用x

this.textBox5.Text = msglines[x];

当然,从循环开始,这将导致显示最后一行。你实际想要展示的是哪一行?


编辑评论;在这种情况下,简单地说:

StringBuilder sb = new StringBuilder();
for (int x = 1; x < msglines.Length; x+=2)
{
    sb.AppendLine(msglines[x]);
}
this.textBox5.Text = sb.ToString();

答案 3 :(得分:2)

在你的for循环中,你正在使用c。你需要使用x。我可以建议您查看reference for for

试试这个......

string[] msglines;

msglines = System.IO.File.ReadAllLines(@"C:\\Users\xA\Desktop\MESSAGES.txt");


for (int x = 0; x < msglines.Length; x++)
{
    this.textBox5.Text = msglines[x];                       
}

答案 4 :(得分:1)

然后你应该使用X作为索引,步长为2,而不是1。

答案 5 :(得分:1)

为简单起见,我将使用从字符串中获取每个其他字符的示例,但是从字符串数组中获取每个其他行的情况类似。

让我们以“Hello”作为你的msglines字符串的例子

alt text
(来源:javabat.com

让我们说你的全局变量c i在你进入for循环之前初始化为0。你的msglines.Lenght将是5.在循环的第四次迭代(x == 3)中,你将尝试访问msglines [6],它超出了数组的范围,因此出错。

你可能想要一些

的内容
int x = 0;
while(x <= msglines.Lenght){
  this.textBox5.Text += msglines[x];
  x = x + 2;
}

for(x=0; x <= msglines.Lenght ; x+=2){
  this.textBox5.Text += msglines[x];
}

要获得奇数行,您将从x初始化为1开始。

至于上面两个完全等效的版本中的哪一个,我建议使用一个更易读的版本。根据我的经验,这总是更好的选择。

答案 6 :(得分:1)

试试这个

string[] msglines;

 msglines = System.IO.File.ReadAllLines(@"C:\Users\xA\Desktop\MESSAGES.txt");

 for (int x = 0; x < msglines.Length; x++)
  {

      this.textBox5.Text = msglines[x++];

  }                   

答案 7 :(得分:1)

你说你想要TextBox中的所有奇数行,但你的循环只显示最后一行,因为你在每次传递时都会覆盖内容。

显示所有奇数行,以换行符分隔:

string lineSep = "";
for (int x = 0; x < msglines.Length; x += 2)
{
    this.textBox5.Text += lineSep + msglines[x];
    lineSep = "\r\n";
}

答案 8 :(得分:0)

ReadAllLines()调用中有一个双反斜杠,导致无法打开文件。

此外,您使用c作为数组索引,看起来您想要x

答案 9 :(得分:0)

我写的代码正是我想要的......

我实际上希望将我文件中的每个奇数行发送到文本框。是的P.S C从1开始初始化

答案 10 :(得分:0)

除了已经提到的cx的索引问题之外,您还会在每次迭代时覆盖textBox5.Text,因此您只会看到最后一行。似乎不太可能是预期的行为。你可能想要这样的东西:

this.textBox5.Text += msglines[x]; // note x instead of c

或者,如果你真的想要一切并且+2本身就是一个错字,你可以在没有任何循环的情况下做到这一点:

this.textBox5.Text = String.Join( "\n", msglines );

答案 11 :(得分:0)

以下函数将返回一个IEnumerable,它在文件中给出奇数行:

private IEnumerable<string> GetOddLines(string fileName)
{
    string[] lines = File.ReadAllLines(fileName);
    IEnumerator allLines = lines.GetEnumerator();
    while (allLines.MoveNext())
    {
        yield return (string)allLines.Current;
        if (!allLines.MoveNext())
        {
            break;
        }
    }
}

如果你想要偶数行,只需在while循环之前添加对allLines.MoveNext()的调用。

答案 12 :(得分:0)

您需要使用Length -1循环数组。 45长度数组仅索引到44。

相关问题