none
contar y sumar datos de un datagridview RRS feed

  • Pregunta

  • Columnas de datagridview_Notas

    Estudiante    Codigo_Clase     Seccion      N1     N2   N3    N4    N5   Promedio    Nota Final

        1                 1010                 1            A        B    C      A      B       3.20             B

        2                 1010                 1            C        A     A     B      B

    quiero sacar promedio de notas cuando le de al boton grabar, los datos se ven asi en el datagridview

    A = 4   B = 3   C = 2     D = 1     F=0

    osea el promedio del estudiante 1 se supone que fuera   4 + 3 + 2 + 4 + 3 dividido entre 5    16/5   3.20 

    y a la misma vez poner una nota final que seria mayor que 3.5 A  mayor 2.5 B Mayor que 1.6 C etc...... tomando en consideracion que si alguna columna entre n1 a n5 esta vacia no la cuente


    viernes, 27 de julio de 2018 20:01

Respuestas

  • Hola Efrain Diaz,

    Una opción sería utilizar un diccionario (Dictionary<TKey, TValue>) para almacenar las notas y sus valores, por ejemplo, las claves o keys sería las letras (A, B, C ...) y los valores que tienen cada una sería el número que representa (4, 3, 2 ..)

    Luego solo harías un For Each a las filas de tu DataGridView y tomar las letras "A, B .." y obtener su valor para sumarlas.

    Un ejemplo sencillo sería :

    Dim dic As New Dictionary(Of String, Integer)
    dic.Add("A", 4)
    dic.Add("B", 3)
    dic.Add("C", 2)
    dic.Add("D", 1)
    dic.Add("F", 0)

    Y para hacer el recorrido :

    For Each row As DataGridViewRow In DataGridView1.Rows
    
        'Obtenemos la suma de las notas de la fila
        Dim suma As Integer = dic(CStr(row.Cells("N1").Value)) +
                              dic(CStr(row.Cells("N2").Value)) +
                              dic(CStr(row.Cells("N3").Value)) +
                              dic(CStr(row.Cells("N4").Value)) +
                              dic(CStr(row.Cells("N5").Value))
    
        'Obtenemos el promedio suma/N° de cursos
        Dim promedio As Double = suma / dic.Count
    
        'Redondeamos el promedio para obtener la nota
        Dim nota = Math.Round(promedio, 0, MidpointRounding.AwayFromZero)
    
        'Si queremos obtener que LETRA le pertenece a la nota obtenida
        Dim notaFinal = dic.FirstOrDefault(Function(x) x.Value = nota).Key
    
        'Mensaje opcional para mostrar el resultado por cada fila
        Dim msg As String = String.Format("Suma de Notas : {0}{4}Promedio : {1}{4}Nota Final : {2} = {3}",
                                    suma, promedio, nota, notaFinal, vbCrLf)
    
        MessageBox.Show(msg)
    
    Next

    Resultado :

    Eso sí, solo faltaría las validaciones, pero entendiendo como aplica la lógica puedes hacer sin ningún problema.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Efrain Diaz sábado, 28 de julio de 2018 11:36
    sábado, 28 de julio de 2018 7:50

Todas las respuestas

  • Hola Efrain Diaz

    Con respecto a tu consulta, te recomiendo probar al siguiente ejemplo de código que puede serte útil:

    Private Sub btnMostrarSuma_Click(sender As Object, e As EventArgs) Handles btnModificar.Click Dim suma As Double For Each celda As DataGridViewCell In DataGridView1.SelectedCells suma = suma + Convert.ToDouble(celda.Value) Next MessageBox.Show(suma.ToString()) End Sub

    Gracias por usar los foros de MSDN

    Pablo Rubio

    viernes, 27 de julio de 2018 21:09
  • Hola Efrain Diaz,

    Una opción sería utilizar un diccionario (Dictionary<TKey, TValue>) para almacenar las notas y sus valores, por ejemplo, las claves o keys sería las letras (A, B, C ...) y los valores que tienen cada una sería el número que representa (4, 3, 2 ..)

    Luego solo harías un For Each a las filas de tu DataGridView y tomar las letras "A, B .." y obtener su valor para sumarlas.

    Un ejemplo sencillo sería :

    Dim dic As New Dictionary(Of String, Integer)
    dic.Add("A", 4)
    dic.Add("B", 3)
    dic.Add("C", 2)
    dic.Add("D", 1)
    dic.Add("F", 0)

    Y para hacer el recorrido :

    For Each row As DataGridViewRow In DataGridView1.Rows
    
        'Obtenemos la suma de las notas de la fila
        Dim suma As Integer = dic(CStr(row.Cells("N1").Value)) +
                              dic(CStr(row.Cells("N2").Value)) +
                              dic(CStr(row.Cells("N3").Value)) +
                              dic(CStr(row.Cells("N4").Value)) +
                              dic(CStr(row.Cells("N5").Value))
    
        'Obtenemos el promedio suma/N° de cursos
        Dim promedio As Double = suma / dic.Count
    
        'Redondeamos el promedio para obtener la nota
        Dim nota = Math.Round(promedio, 0, MidpointRounding.AwayFromZero)
    
        'Si queremos obtener que LETRA le pertenece a la nota obtenida
        Dim notaFinal = dic.FirstOrDefault(Function(x) x.Value = nota).Key
    
        'Mensaje opcional para mostrar el resultado por cada fila
        Dim msg As String = String.Format("Suma de Notas : {0}{4}Promedio : {1}{4}Nota Final : {2} = {3}",
                                    suma, promedio, nota, notaFinal, vbCrLf)
    
        MessageBox.Show(msg)
    
    Next

    Resultado :

    Eso sí, solo faltaría las validaciones, pero entendiendo como aplica la lógica puedes hacer sin ningún problema.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Efrain Diaz sábado, 28 de julio de 2018 11:36
    sábado, 28 de julio de 2018 7:50