c # - Попытка заполнить текстовое поле и просмотр списка из текстового файла - PullRequest
0 голосов
/ 10 октября 2019

Я могу загрузить только текстовое поле и не могу получить представление списка для заполнения. Но после удаления this.textBox1.Text = sr.ReadToEnd(); список заполнен. Вот код:

using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
{
    string line = String.Empty;
    this.textBox1.Text = sr.ReadToEnd(); // remove it, listview working
    while ((line = sr.ReadLine()) != null)
    {
        string[] data = line.Split(new char[0]);
        ListViewItem item = new ListViewItem
        {
            Text = data[0]
        };
        item.SubItems.Add(data[1]);
        listView1.Items.Add(item);
    }
}

Скриншоты: Img1 Img2

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Ну, sr.ReadToEnd() читает файл до конца, и поэтому ReadLine() бесполезен.

Давайте прочитаем файл построчно и обновим text(который мы присвоим this.textBox1.Text) и listView1.Items:

StringBuilder text = new StringBuilder();

bool firstLine = true; 

// We don't want redrawing after each ListViewItem adding
listView1.BeginUpdate();

try {
  // File.ReadLines is easier to manipulate with StreamReader
  // if you want just read lines
  foreach (string line in File.ReadLines(openFileDialog1.FileName)) {
    if (!firstLine)
      sb.AppendLine();

    sb.Append(line);
    firstLine = false; 

    // 3: We want at most 3 chunks (item, subitem and tail to throw away)
    string[] data = line.Split(new char[0], 3);

    ListViewItem item = new ListViewItem() {
      Text = data[0]
    };

    if (data.Length > 1)
      item.SubItems.Add(data[1]);

    listView1.Items.Add(item);
  }
}
finally {
  // The file has been scanned, items added; now we a ready to redraw the listView1   
  listView1.EndUpdate();
}

this.textBox1.Text = text.ToString();
0 голосов
/ 10 октября 2019

Вы можете попробовать это:

string filename = openFileDialog1.FileName;
var lines = File.ReadAllLines(filename);
textBox1.Text = string.Join(Environment.NewLine, lines);
foreach ( string line in lines )
{
  var items = line.Split(new char[0]);
  if ( items.Length > 0 )
  {
    var item = new ListViewItem(items[0]);
    if ( items.Length > 1 )
      item.SubItems.Add(items[1]);
    listView1.Items.Add(item);
  }
}
0 голосов
/ 10 октября 2019

Вы можете использовать следующее.

ReadToEnd делает это: Читает все символы от текущей позиции до конца потока. Вы теряете положение потока.

using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
{
    string line = String.Empty;
    StringBuilder sb = new StringBuilder();
    // this.textBox1.Text = sr.ReadToEnd(); // remove it, listview working
    while ((line = sr.ReadLine()) != null)
    {
        string[] data = line.Split(new char[0]);
        ListViewItem item = new ListViewItem
        {
            Text = data[0]
        };
        item.SubItems.Add(data[1]);
        listView1.Items.Add(item);
        sb.AppendLine(line);
    }
    this.textBox1.Text = sb.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...