2016-04-23 3 views
2

Импорт CSV в ListView в C# дублирует первую запись.C# ListView повторяющийся 1 столбец из csv

Исходный файл CSV: Original file image

Что я получаю:Visual Studio Error

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

private void btn_Cargar_Click(object sender, EventArgs e) 
//button load .csv file click 
{ 
    list_Previ.Items.Clear(); 
    filepath = ""; 
    txtbox_ArchivoCargado.Text = ""; 
    cargarCSV(); 
} 

private void cargarCSV() //Load .csv 
{ 
    OpenFileDialog dialogoCargar = new OpenFileDialog(); 
    dialogoCargar.Filter = "Archivos CSV|*.csv"; 
    dialogoCargar.FilterIndex = 1; 
    if(dialogoCargar.ShowDialog() == DialogResult.OK) 
    { 
     filepath = dialogoCargar.FileName; 
     txtbox_ArchivoCargado.Text = filepath; 
    } 
} 

private void btn_Validame_Click(object sender, EventArgs e) //Validate Button Click 
{ 
    if(filepath == "") MessageBox.Show("No hay nada que validar\nPuedes empezar cargando un archivo", "Corporativo Acosta | Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
    if(filepath != "") 
    { 
     Validar(); 
    } 
} 

private void Validar() //Validate 
{ 
    empleadosValido = true; 
    try { 
     FileStream fileStreamNew = File.Open(filepath, FileMode.Open, FileAccess.ReadWrite); 
     StreamReader streamRead = new StreamReader(fileStreamNew); 
     string strView = streamRead.ReadToEnd(); 
     streamRead.Close(); 
     fileStreamNew.Close(); 
     String[] strArray = strView.Split(new char[] { ',' }); 
     ListViewItem item = new ListViewItem(strArray[0].ToString()); 

     item.SubItems.Add(strArray[0].ToString()); 
     item.SubItems.Add(strArray[1].ToString()); 
     item.SubItems.Add(strArray[2].ToString()); 
     item.SubItems.Add(strArray[3].ToString()); 
     item.SubItems.Add(strArray[4].ToString()); 
     item.SubItems.Add(strArray[5].ToString()); 
     item.SubItems.Add(strArray[6].ToString()); 

     list_Previ.Items.Add(item); 

    } 
    catch (Exception ex) 
    { 
     if (ex is IOException) 
     { 
      MessageBox.Show("El archivo se encuentra en uso por otro programa\nPor favor cierra otros programas e intenta de nuevo.", "Corporativo Acosta | Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      empleadosError = true; 
      MessageBox.Show(ex.ToString()); 
     } 
     if (ex is IndexOutOfRangeException) 
     { 
      MessageBox.Show("Hay un problema con tus columnas.\nVerifica que correspondan las columnas a importar\ncon las de la tabla (7 columnas)", "Corporativo Acosta | Error", MessageBoxButtons.OK ,MessageBoxIcon.Error); 
      empleadosError = true; 
      MessageBox.Show(ex.ToString()); 
     } 

    } 
} 
+1

Вы можете __access__ базовый элемент как SubItems [0], но вы __must не добавляете его__ как subItem, иначе вы его дважды. Удалить 'item.SubItems.Add (strArray [0] .ToString());'! – TaW

ответ

3

Я подозреваю, что это проблема:

ListViewItem item = new ListViewItem(strArray[0].ToString()); 

item.SubItems.Add(strArray[0].ToString()); 

Вы хотите добавить первое значение дважды, один раз в качестве «основного» пункта и один раз в качестве подэлемента. Попробуйте просто удалить эту вторую строку.

Из документации View.Details:

Каждый элемент в отдельной строке с дополнительной информацией о каждом элементе в столбцах отображается. В самом левом столбце содержится небольшая иконка и метка, а в последующих столбцах содержатся подпункты, указанные в приложении. В столбце отображается заголовок, который может отображать заголовок для столбца. Пользователь может изменять размер каждого столбца во время выполнения.

Так что это звучит как проблема - первый отображаемый столбец показывает значение, которое вы передаете конструктору ListViewItem.

Как и в сторону, у вас уже есть массив строк, так что вам не нужны все эти ToString звонки:

ListViewItem item = new ListViewItem(strArray[0]); 

item.SubItems.Add(strArray[1]); 
item.SubItems.Add(strArray[2]); 
item.SubItems.Add(strArray[3]); 
item.SubItems.Add(strArray[4]); 
item.SubItems.Add(strArray[5]); 
item.SubItems.Add(strArray[6]); 

Или с помощью инициализатора объекта:

ListViewItem item = new ListViewItem(strArray[0]) 
{ 
    SubItems = { strArray[1], strArray[2], strArray[3], 
       strArray[6], strArray[5], strArray[6] }; 
}; 
+0

Спасибо. Работал как шарм! –

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