C#ListView从csv重复1列

时间:2016-04-23 08:22:36

标签: c# listview csv

将.csv导入c#中的ListView会复制第一个条目。

原始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 个答案:

答案 0 :(得分:3)

我怀疑这是问题所在:

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

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

您将第一个值添加两次,一次作为" main"项目和一次作为子项目。尝试删除第二行。

来自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] };
};