【问题标题】:print the contents of a list <> in a textbox在文本框中打印列表 <> 的内容
【发布时间】:2014-03-05 14:43:17
【问题描述】:

早上好,我遇到了以下问题。我正在读取文件夹中文件(.txt)的内容,但我现在想要将文件的内容打印到文本框中,但我遇到了问题。

我必须对此进行编码。

FolderBrowserDialog Lectura = new FolderBrowserDialog();
DialogResult response = Lectura.ShowDialog();

if (response == DialogResult.OK)
{
    string[] files = Directory.GetFiles(Lectura.SelectedPath);
    ListBox archivosListBox = new ListBox();
    archivosListBox.Items.AddRange(files);

    int tamanoLista = archivosListBox.Items.Count;
    List <string[]> Miarchivo = new List<string[]>();

    foreach (string archivos in archivosListBox.Items)
    {
        Miarchivo.Add(System.IO.File.ReadAllLines(archivos));
    }

    string[] leerArchivo;
    int j =Miarchivo.Count;

    for (int i = 0; i<tamanoLista; i++)
    {
        leerArchivo = Miarchivo[i];

        for (int k = 0; k < Miarchivo[i].Count(); k++)
        {
            //textBox1.Text += leerArchivo[k] ;
        }
    }
}

【问题讨论】:

  • 你有什么问题?编译器错误?例外?数据有误?
  • 发生的事情是我打印了,但由于所有内容都在一行中,它不会逐行打印,因此我将所有内容都留在了一行中。
  • @EvanL:List&lt;string[]&gt; 是因为列表中的每个项目都将保存File.ReadAllLines()(第一个 foreach 循环)的结果,这是一个字符串 []
  • @Abbas 是的,删除...我在阅读之前发布。
  • @JeissonNiño 你的文本框设置为多行吗?

标签: c# .net list collections textbox


【解决方案1】:

您需要在 TextBox 中的每个条目后放置一个换行符。将您的代码更改为以下内容:

for (int k = 0; k < Miarchivo[i].Count(); k++)
{
    textBox1.Text += leerArchivo[k] + Environment.NewLine;
}

更多阅读:Environment.NewLine Property (MSDN).

【讨论】:

  • @JeissonNiño 感谢他,通过检查投票按钮下方的绿色复选标记来支持和/或将其标记为答案 =)
  • 在这里使用 StringBuilder 代替 textBox1.Text += 更好:它可以避免不断重绘 textBox1
  • @Abbas 说我不能,直到几分钟;)
  • 好点,虽然这不是 OP 的问题,但就性能而言,你是对的! :)
  • @Abbas,差不多 4 年后,我在搜索中找到了这个。谢谢你!!我一直认为我的代码对于类似的东西是错误的,我需要的只是“+=”而不是“=”。
【解决方案2】:

使用ReadAllText 代替ReadAllLines 并将整个循环替换为字符串连接:

List<string> Miarchivo = new List<string>();
foreach (string archivos in archivosListBox.Items)    
    Miarchivo.Add(File.ReadAllText(archivos));

textBox1.Text = String.Join(Environment.NewLine, Miarchivo);

另一个(可能更好的解决方案)是使用 TextBox.Lines 属性并使用 LINQ 获取文件内容:

textBox1.Lines = archivosListBox.Items
                     .Cast<string>()
                     .SelectMany(archivos => File.ReadLines(archivos))
                     .ToArray();

【讨论】:

  • +1 用于 LINQ 解决方案,更加优雅。避免创建对象 (StringBuilder)、循环并消除对 NewLine 分隔符的需要。
【解决方案3】:

您宁愿更新textBox1.Text一次以避免不断重绘

    if (response == DialogResult.OK)
    {

        string[] files = Directory.GetFiles(Lectura.SelectedPath);
        ListBox archivosListBox = new ListBox();
        archivosListBox.Items.AddRange(files);

        int tamanoLista = archivosListBox.Items.Count;

        List <string[]> Miarchivo = new List<string[]>();
        foreach (string archivos in archivosListBox.Items)
        {
          Miarchivo.Add(System.IO.File.ReadAllLines(archivos));
        }

        // Output into textBox1
        StringBuilder sb = new StringBuilder();

        foreach(String[] leerArchivo in Miarchivo) 
          foreach(String item in leerArchivo) {
            if (sb.Length > 0) 
              sb.AppendLine(); // <- Or other deriver, e.g. sb.Append(';');

            sb.Append(item);
          }

        // Pay attention: textBox1 has been updated once only
        textBox1.Text = sb.ToString();
    }

【讨论】:

  • 为什么如果你不能这样做:foreach(String item in leerArchivo) { sb.AppendLine(item); }?现在它看起来很丑,并且进行了不必要的检查。
  • @Abbas:为了避免在文本末尾出现 NewLine:“A NewLine B”与“A NewLine B NewLine”
  • 然后我可以在内部循环结束时执行此操作一次textBox1.Text = textBox1.Text.TrimEnd('\r', '\n');
【解决方案4】:

根据您的 cmets,听起来您只需要在每行末尾换行即可:

textBox1.Text += leerArchivo[k] + Environment.NewLine ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多