none
El datagrid no me carga con coma RRS feed

  • Pregunta

  • Buenas tardes Chicos

    Tengo el sigueinte problema estoy agregando a un data gridview un excel entonces cuando doy al boton de subir excel (xlsx)

    Me sube esto en mi data grid

    En mi data set lo tengo asi

    Este es mi codigo del boton de importar

     private void button1_Click(object sender, EventArgs e)
            {
    
               
    
                string ruta = "";
                string tmp = Application.StartupPath + "\\temp.xlsx";
                try
                {
                    OpenFileDialog openfile1 = new OpenFileDialog();
                    openfile1.Filter = "Excel Files |*.xlsx";
                    openfile1.Title = "Seleccione el archivo de Excel";
                    if (openfile1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        if (openfile1.FileName.Equals("") == false)
                        {
                            ruta = openfile1.FileName;
                        }
                    }
                    else
                        return;
    
                    dt = LeerExcel(ruta, "Hoja1");
    
                    
    
    
                    DataTable dt1 = GetDataTable();
    
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i][0].ToString() == "")
                            break;
                        DataRow dr = dt.Rows[i];
                        DataRow newRow = dt1.NewRow();
                        newRow["Codigo"] = Convert.ToString(dr[0]);
                        newRow["Ean"] = dr[1];
                        newRow["Descripcion"] = dr[2];
                        newRow["Cantidad"] = dr[3];
                        newRow["Paquete"] = dr[4];
                        newRow["Neto"] = Convert.ToDecimal(dr[7]);
                        newRow["Importe"] = Convert.ToDecimal(dr[6]);
                        newRow["cantidadleida"] = 0;
                        newRow["pventa"] = 0;
                     
                     
                        dt1.Rows.Add(newRow);
                    }
                    DataView mifiltro = dt1.DefaultView;
                    this.dataGridView1.DataSource = mifiltro;
                
                    dataGridView1.Columns[0].HeaderText = "Referencia";
                    dataGridView1.Columns[1].HeaderText = "Cod. Barra";
                    dataGridView1.Columns[2].HeaderText = "Descipcion";
                    dataGridView1.Columns[3].HeaderText = "Cantidad";
                    dataGridView1.Columns[4].HeaderText = "Paquete";
                    dataGridView1.Columns[5].HeaderText = "Precio Neto";
                    dataGridView1.Columns[6].HeaderText = "Precio Total";
    
                    dataGridView1.Columns[7].HeaderText = "Cantidad Leida";
                    dataGridView1.Columns[8].HeaderText = "Precio Venta";
    
                    dataGridView1.Columns[0].ReadOnly = true;
                    dataGridView1.Columns[1].ReadOnly = true;
                    dataGridView1.Columns[2].ReadOnly = true;
                    dataGridView1.Columns[3].ReadOnly = true;
                    dataGridView1.Columns[4].ReadOnly = true;
                    dataGridView1.Columns[5].ReadOnly = true;
                    dataGridView1.Columns[6].ReadOnly = true;
                    dataGridView1.Columns[7].ReadOnly = true;
                    dataGridView1.Columns[8].ReadOnly = false;
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
      DataTable LeerExcel(string strPath, string strSheet)
            {
                DataTable ret;
                int row;
                int column;
                int colPos = 0;
                using (SLDocument sl = new SLDocument(strPath, strSheet))
                {
    
                    SLWorksheetStatistics stats = sl.GetWorksheetStatistics();
                    int iStartColumnIndex = stats.StartColumnIndex;
                    int iStartRowIndex = stats.StartRowIndex;
                    int iEndColumnIndex = stats.EndColumnIndex;
                    int iEndRowIndex = stats.EndRowIndex;
    
                    ret = new DataTable("Excel");
    
                    for (row = iStartRowIndex; row <= iStartRowIndex; ++row)
                    {
                        for (column = iStartColumnIndex; column <= iEndColumnIndex; column++)
                        {
                            string strColName = sl.GetCellValueAsString(row, column);
                            if (string.IsNullOrWhiteSpace(strColName))
                            {
                                ret.Columns.Add($"Columna{column}");
                            }
                            else
                            {
                                ret.Columns.Add(ret.Columns.Contains(strColName) ?
                                    strColName + "_" + (ret.Columns.Cast<DataColumn>().Where(x => x.ColumnName == strColName).Count() + 1).ToString()
                                    : strColName);
                            }
                        }
                    }
    
                    bool bSeguir = true;
                    int nColumnCodBarras1 = 1;
                    int nColumnCodBarras2 = 27;
    
                    for (row = 2; bSeguir; ++row)
                    {
                        string strCeldaCod1 = sl.GetCellValueAsString(row, nColumnCodBarras1);
                        string strCeldaCod2 = sl.GetCellValueAsString(row, nColumnCodBarras2);
                        if (strCeldaCod1 == strCeldaCod2)
                        {
                            bSeguir = false;
                            continue;
                        }
                        DataRow dataRow = ret.NewRow();
                        colPos = 0;
                        for (column = iStartColumnIndex; column <= iEndColumnIndex; column++)
                        {
                            dataRow[colPos] = sl.GetCellValueAsString(row, column);
                            colPos++;
                        }
                        ret.Rows.Add(dataRow);
                    }
                }
                return ret;
            }

    Saludos

       


    ruben

    martes, 16 de enero de 2018 15:52

Respuestas

  • Puede ser un problema de conversión también.
    Acabé de probar e investigar un poco y muchos han tenido problema de convertir algo de tipo string a Decimal, y se pierde el punto.

    Si lees de tu excel valores con ".", por ejemplo lees "125.5", podrías, en vez de hacer esto:
    newRow["Neto"] = Convert.ToDecimal(dr[7]);
    newRow["Importe"] = Convert.ToDecimal(dr[6]);

    hacer esto:
    newRow["Neto"] = Convert.ToDecimal(dr[7], System.Globalization.CultureInfo.InvariantCulture);
    newRow["Importe"] = Convert.ToDecimal(dr[6], System.Globalization.CultureInfo.InvariantCulture);
    Si lees de tu excel valores con "," no debes usar 
    System.Globalization.CultureInfo.InvariantCulture


    martes, 16 de enero de 2018 17:37
  • podés hacer:

    newRow["Neto"] = string.Format("{0:0.00}", Convert.ToDecimal(dr[7], System.Globalization.CultureInfo.InvariantCulture));

    martes, 16 de enero de 2018 18:09

Todas las respuestas

  • el data set esta correcto

    Pero al agregar al datagrid no agrega bien


    ruben

    martes, 16 de enero de 2018 17:03
  • Cuando compruebo el valor de mi dt1

    es este el resultado

    como pueden ver el Neto pone 13 no 1.028


    ruben

    martes, 16 de enero de 2018 17:15
  • asi es como tengo mi dt1 

    private DataTable GetDataTable()
            {
                DataTable dt2 = new DataTable();
                dt2.Columns.Add("Codigo");
                dt2.Columns.Add("Ean");
                dt2.Columns.Add("Descripcion");
                dt2.Columns.Add("Cantidad");
                dt2.Columns.Add("Paquete");
                dt2.Columns.Add("Neto", typeof(decimal));
                dt2.Columns.Add("Importe", typeof(decimal));
                dt2.Columns.Add("cantidadleida");
                dt2.Columns.Add("pventa", typeof(decimal));

                return dt2;


    ruben

    martes, 16 de enero de 2018 17:18
  • Hola. has definido las columnas en tiempo de diseño o solo las asignas en el datasource, 

    podrías probar definiendo las columnas y en la propiedad defaultcellstyle cambiarle al tipo de dato que esperas recibir

    si lo quieres hacer mediante código podrías utilizar algo como

    Set DataGridView column styles in C#


    Votar es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 martes, 16 de enero de 2018 17:32
    martes, 16 de enero de 2018 17:26
  • Puede ser un problema de conversión también.
    Acabé de probar e investigar un poco y muchos han tenido problema de convertir algo de tipo string a Decimal, y se pierde el punto.

    Si lees de tu excel valores con ".", por ejemplo lees "125.5", podrías, en vez de hacer esto:
    newRow["Neto"] = Convert.ToDecimal(dr[7]);
    newRow["Importe"] = Convert.ToDecimal(dr[6]);

    hacer esto:
    newRow["Neto"] = Convert.ToDecimal(dr[7], System.Globalization.CultureInfo.InvariantCulture);
    newRow["Importe"] = Convert.ToDecimal(dr[6], System.Globalization.CultureInfo.InvariantCulture);
    Si lees de tu excel valores con "," no debes usar 
    System.Globalization.CultureInfo.InvariantCulture


    martes, 16 de enero de 2018 17:37
  • Hola Augusto

    NO es en tiempo de Diseño

    este es mi datagrid

    Como puedo definir la columna en tiempo de ejecución?

    saludos


    ruben

    martes, 16 de enero de 2018 17:38
  • Hola Nicolas mi excel es este

    saludos


    ruben

    martes, 16 de enero de 2018 17:46
  • "Hola Augusto

    NO es en tiempo de Diseño..."

    Si ya veo , te pase este enlace para que lo hagas como lo vienes haciendo definiendolas por código

    Set DataGridView column styles in C#


    Votar es agradecer.
    Saludos.
    Lima-Perú

    martes, 16 de enero de 2018 17:46
  • Nicolas si funciona pero sabes que me pasa me pone uno 1.30  pero mira el excel es 1.028

    por que puede ser?

    saludos


    ruben

    martes, 16 de enero de 2018 17:49
  • Olvidalo Nicolas esta perfecto

    ruben

    martes, 16 de enero de 2018 17:50
  • Perfecto Nicolas millones de gracias

    saludos


    ruben

    martes, 16 de enero de 2018 17:51
  • Nicolas mira como puedo hacer para que sea diempre dos decimales mira la fila 13 sale un 4 y seria bueno un 4,00

    saludos


    ruben

    martes, 16 de enero de 2018 17:54
  • podés hacer:

    newRow["Neto"] = string.Format("{0:0.00}", Convert.ToDecimal(dr[7], System.Globalization.CultureInfo.InvariantCulture));

    martes, 16 de enero de 2018 18:09
  • Mas que perfecto

    Un saludo amigazo


    ruben

    martes, 16 de enero de 2018 18:18