2013-11-15 1 views
0

Мой ниже код сначала пишет восклицательный знак (!) С разделителем заголовка в TXT-файл, а затем циклически перебирает каждый элемент и subItem в элементе управления ListView, помещая каждое значение записи в новую строку в моем .txt-файле. Все значения необходимы для просмотра пользователями в ListBox, но при записи в файл мне нужно только написать поля, которые используются на следующем шаге, используя файл .txt в качестве источника данных для документа MS Word MailMerge.Записывать специфические SubItems в .txt во время цикла с помощью элемента управления ListView?

Вместо того, чтобы циклически и добавления каждой записи значение поля моего StringBuilder, мне нужен способ, чтобы получить только те значения, где заголовок ListView столбца является следующее:

memno имя address1 address2 address3 сал fuldate SYS

private void btnMerge_Click(object sender, EventArgs e) 
     { 
      try 
      {  
       string docLoc = ""; 
       string docSource = ""; 
       StringBuilder sb; 
       // Change this to the DataSource FilePath 
       StreamWriter sw = new StreamWriter("C:\\Users\\NAME\\Desktop\\Test2.txt"); 
       string fileHeaderTxt = "memno!name!address1!address2!city!state!zip!old_addr1!old_addr2!old_city!old_state!old_zip!sys!fuldate!sex!lname!sal!address3"; 
       sb = new StringBuilder(); 
       sb.Append(fileHeaderTxt); 
       sw.WriteLine(sb.ToString()); 
       sb.Clear(); 

       if (lvData.Items.Count > 0) 
       { 
        foreach (ListViewItem lvI in lvData.Items) 
        { 
         sb = new StringBuilder(); 
         foreach (ListViewItem.ListViewSubItem lvSI in lvI.SubItems) 
         { 
          sb.Append(string.Format("{0}!", lvSI.Text)); 
         } 
         sw.WriteLine(sb.ToString()); 
        } 
        sw.WriteLine(); 
       } 
       //sb.Clear(); 
       sw.Close(); 
       MessageBox.Show("Complete"); 

       if (rbPrint.Checked) 
       { 
        Print(docLoc, docSource); 
       } 
       if (rbCommit.Checked) 
       { 
        Commit_NetFYI(); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data); 
      } 
      finally 
      { 
       // 
      } 
     } 

Я стучал в го за последние пару часов, и просто не может показаться, что это получилось. У кого-нибудь есть идеи?

EDIT:

Я изменил свой код, используя решение грамматик, но, кажется, я что-то отсутствует. Каждая итерация цикла записывает строку, содержащую все предыдущие циклические значения, плюс новое значение.

Грубый пример:!!!

Header1 Заголовок 2 Header3 header4

1 2 3 4 5 6 7 8!!!!!!!!!!

1! 2! 3! 4! 5! 6! 7! 8! 9! 10! 11! 12

1! 2! 3! 4! 5! 6! 7! 8! 9! 10 ! 11! 12! 13! 14! 15! 16 и т. Д.

Вот мой текущий код:

private void btnMerge_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       string docLoc = ""; 
       string docSource = ""; 
       StringBuilder sb; 
       // Change this to the DataSource FilePath 
       StreamWriter sw = new StreamWriter("C:\\Users\\NAME\\Desktop\\Test2.txt"); 
       string fileHeaderTxt = "memno!name!address1!address2!city!state!zip!old_addr1!old_addr2!old_city!old_state!old_zip!sys!fuldate!sex!lname!sal!address3"; 
       sb = new StringBuilder(); 
       sb.Append(fileHeaderTxt); 
       sw.WriteLine(sb.ToString()); 
       sb.Clear(); 

       if (lvData.Items.Count > 0) 
       { 
        foreach (ListViewItem lvI in lvData.Items) 
        { 
         var indices = new int[] { 0, 1, 2, 3, 12, 13, 16, 17 }; 
         foreach (int i in indices) 
         { 
           sb.Append(string.Format("{0}!", lvI.SubItems[i].Text)); 
         } 
         sw.WriteLine(sb.ToString()); 
         sb.Clear(); 
        } 
        sw.WriteLine(); 
       } 
      } 
    } 

EDIT2:

Понял, не убирая мой объект StringBuilder каждый раз после через мой первый цикл. Отредактированный код выше, чтобы отразить рабочий код.

ответ

1

Вместо того чтобы просто повторять все подэлементы, сделайте массив индексов подэлементов в том порядке, в котором вы хотите, и выполните итерацию индексов.

var indices = new [] { 0, 1, 2, 4, 9 }; // whatever you want 
foreach (int i in indices) 
{ 
    sb.Append(string.Format("{0}!", lvI.SubItems[i].Text)); 
} 
+0

Спасибо Грамматику! :) После использования вашего примера у меня возникла проблема с записью всех предыдущих значений сумм циклов + новое значение, но я понял, что понял. Забыл очистить свой объект stringBuilder после завершения каждой итерации в первом цикле: P –

Смежные вопросы