none
Generar codigo segun cantidad de Items

    Pregunta

  • Buenas noches, quisera saber como generar codigo dentro de un datagridview por ejemplo en un textbox yo tengo un codido 1805001 entonces en otro textbox yo digo que hare 6 (escribo 6) registros ya sea un boton o al perder el foco de este en el dgv me genere 

         Codigo      |..... (otras columnas....)

    1805001-01

    1805001-02

    1805001-03

    1805001-04

    1805001-05

    1805001-06

    como lograr eso?

    Saludos y Gracias


    jueves, 3 de mayo de 2018 13:25

Respuestas

  • En un proyecto nuevo de Windows Forms con VB.net, agregué el siguiente código al formulario.

    Imports System.ComponentModel
    
    Public Class Form1
    
        Private Property BoundData As BindingList(Of Data)
        Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
            Dim total As Integer
            Dim codigo As String
            Dim d As Data
    
            codigo = tbCodigoBase.Text
            total = Convert.ToInt32(tbTotal.Text)
    
            For i As Integer = 1 To total
                d = New Data()
                d.Id = String.Format("{0}-{1}", codigo, i)
                BoundData.Add(d)
            Next
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            BoundData = New BindingList(Of Data)()
            dgvData.DataSource = BoundData
        End Sub
    End Class
    

    El código asume que en el formulario hay un textbox llamado tbCodigoBase, otro tbTotal y un botón btnAdd.  Además, hay una grilla con AutoGenerateColumns activado (true) llamado dgvData.

    La clase que utilizo para llenar la grilla se llama Data:

    Public Class Data
    
        Public Property Id As String
        Public Property Data As String
    
    End Class
    

    Funciona perfectamente.  Nótese que omití el código que verifica que lo escrito en tbTotal sea un número válido y positivo.  Le recuerdo que usted debe hacer esta comprobación.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    • Marcado como respuesta Javier Roque viernes, 25 de mayo de 2018 21:19
    jueves, 17 de mayo de 2018 21:53
    Moderador

Todas las respuestas

  • Voy a hacer el ejemplo usando una clase.

    public class Registro
    {
        public string Id { get; set; }
        public string Etc { get; set; }
    }

    Luego vinculo el DGV (con columnas previamente configuradas) a una lista vacía de estos registros.

    //Esta es una propiedad en el formulario.
    private BindingList<Registro> Registros { get; set; }
    
    private void Form_Load(object sender, EventArgs e)
    {
        Registros = new BindingList<Registro>();
        dgv1.DataSource = Registros;
    }

    Entonces cuando se presiona un botón para generar las filas:

    private void btnGenerar_Click(object sender, EventArgs e)
    {
        string mayor = tbMayor.Text;
        int total;
        if (!Int32.TryParse(tbTotal.Text, out menor))
        {
            MessageBox.Show("El valor del total de registros a crear no es un número válido.");
            return;
        }
        for (int i = 1; i <= total; ++i)
        {
            Registros.Add(new Registro() { Id = $"{mayor}-{i}", Etc = $"Nuevo {i}" });
        }
    }

    Y eso sería todo.


    Jose R. MCP
    Code Samples

    lunes, 14 de mayo de 2018 6:03
    Moderador
  • no entiendo la parte del bingdinlist no uso binding lo hago x codigo la vinculacion no por diseño (Bingding) o es una propiedad nada mas?

    me dice que no esta definido

    BindingList


    Alguien me lo traduce a VB por favor. Las conversiones no me salen bien.
    lunes, 14 de mayo de 2018 15:45
  • BindingList es una colección en System.ComponentModel.  Una colección como otras, capaz de agrupar elementos del mismo tipo.  No tiene nada de raro.  Lo bonito de esta colección, sin embargo, es que avisa al DGV cuando elementos nuevos se agregan o cuando se remueven elementos.  Esto hace que agregar o eliminar filas del DGV sea tan fácil como agregar o eliminar elementos de la colección.  Por eso es que la uso aquí.

    Luego, en mi respuesta yo en ningún momento he dicho que hay que hacer algún binding con Visual Studio en tiempo de diseño, si es a lo que se refiere con "(Binding)".  En tiempo de diseño solamente debe crear las columnas del DGV y asegurarse que la propiedad DataPropertyName de cada columna está configurada al nombre de la propiedad en la clase Registro (en mi ejemplo) que representará.  Luego de eso, en tiempo de ejecución aplica el DataSource y listo, el DGV se llena con datos.


    Jose R. MCP
    Code Samples

    lunes, 14 de mayo de 2018 20:04
    Moderador
  • Ok. System.ComponentModel es una referencia entonces que debo añadir!

    Hay 3 tipos Model. Composition

    Model. DataAnnotations

     Model. Composition.Registration

    A cual se refiere?

    miércoles, 16 de mayo de 2018 22:41
  • No tiene que agregar ninguna referencia adicional.  Está en System.dll, que siempre está referenciado.  Tal vez lo único que le falta es el using System.ComponentModel;.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    miércoles, 16 de mayo de 2018 23:57
    Moderador
  • En este codigo

    private void btnGenerar_Click(object sender, EventArgs e)
    {
        string mayor = tbMayor.Text;
        int total;
        if (!Int32.TryParse(tbTotal.Text, out menor))
        {
            MessageBox.Show("El valor del total de registros a crear no es un número válido.");
            return;
        }
        for (int i = 1; i <= total; ++i)
        {
            Registros.Add(new Registro() { Id = $"{mayor}-{i}", Etc = $"Nuevo {i}" });
        }
    }
    dice menor pero no esta declarado, tbmayor es un textbox entonces debo tener 2 textbox? porque la idea e stener un textbox  y un boton mas donde le digo al textbox q son 5 registros y al dar click al boton me genere los codigos hasta el 5

    jueves, 17 de mayo de 2018 13:58
  • Con un ejemplo grafico le explico cuando doy click nuevo se genera mi codigo de cadena el de arriba (lo que esta rojo) en base a eso yo digo q son 5 registros y cuando clickee generar me llene los 5 correspondientes 

    1805307-01;1805307-02;1805307-03;1805307-04;1805307-05 en sus filas correspondientes respecto a la columna CodigoMuestra, eso es lo que intento hacer y asi sucesivamente por cada nuevo registro que genere, espero me haya dejado entender y me pueda seguir ayudando ya que he echo lo indicado y al dar click en generar este no lo realiza.

    La parte de este codigo 

    private void btnGenerar_Click(object sender, EventArgs e)
    {
        string mayor = tbMayor.Text;
        int total;
        if (!Int32.TryParse(tbTotal.Text, out menor))
        {
            MessageBox.Show("El valor del total de registros a crear no es un número válido.");
            return;
        }
        for (int i = 1; i <= total; ++i)
        {
            Registros.Add(new Registro() { Id = $"{mayor}-{i}", Etc = $"Nuevo {i}" });
        }
    }

    convertido sale:

    Private Sub btnGenerar_Click(sender As Object, e As EventArgs)
    	Dim mayor As String = tbMayor.Text
    	Dim total As Integer
    	If Not Int32.TryParse(tbTotal.Text, menor) Then
    		MessageBox.Show("El valor del total de registros a crear no es un número válido.")
    		Return
    	End If
    	For i As Integer = 1 To total
    		Registros.Add(New Registro())
    	Next
    End Sub
    Pero alli arrriba ud menciona la columna etc q en mi caso seria CodigoMuestra pero al convertirlo a vb este ya no sale.

    jueves, 17 de mayo de 2018 14:21
  • En su pregunta original, usted dice:

    por ejemplo en un textbox yo tengo un codido 1805001 entonces en otro textbox

    Por eso yo tengo en el código de ejemplo que le proporcioné, 2 textboxes.

    Si usted no utiliza dos textboxes, entonces hágalo como sea que lo necesite.  Mi código usa como fuente 2 textboxes, pero si el suyo no, no es problema siempre y cuando haya forma de saber el código base y la cantidad de registros a hacer.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 17 de mayo de 2018 18:52
    Moderador
  • Hice una clase Registro con 2 propiedades:  El ID que usted desea y una propiedad Etc para simular más datos.  Usted utilice una clase que tenga una propiedad ID, que es la que necesita de este código, y la cantidad adicional de propiedades que usted necesite y se olvidas del ETC.

    Luego si al nuevo registro no le asigna un valor a la propiedad ID, pues no ganará nada.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 17 de mayo de 2018 18:55
    Moderador
  • Ok entones al txtcodigo cadena lo toma como tbmayor y al text al que agrego el numero de registros viene hacer el tbtotal

    ya hice los cambios pero me refiero q el codigo q ud me coloca al convertir a vb no sale el etc

    Entonces imagino que en lugar de etc debo poner la cantidad de columnas de mi tabla correcto?
    jueves, 17 de mayo de 2018 20:11
  • No sé si hay una sintaxis mejor en VB.net, pero usted debería hacer esto:

    Dim r As Registro
    
    'Dentro del bucle FOR:
    r = New Registro()
    With r
        .Id = $"{mayor}-{i}" 'Si es que VB.net acepta interpolación.  Si no, la siguiente línea.
        .Id = String.Format("{0}-{1}", mayor, i)
        .OtraPropiedadParaOtraColumnaDeLaGrilla = ....
        'En fin, las propiedades que usted guste inicializar en un nuevo registro, si es que hay alguna.  No son necesarias.
    End With
    Registros.Add(r)


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 17 de mayo de 2018 20:39
    Moderador
  • Ok, pero se ve el efecto que agrega filas pero el codigo sale vacio y si digo q son 2 y sigo presionando sigue generando filas blanco cuando el limite debe ser 2, pero bueno igual no se que sea pero no sale el numero solo en blanco
    jueves, 17 de mayo de 2018 21:34
  • En un proyecto nuevo de Windows Forms con VB.net, agregué el siguiente código al formulario.

    Imports System.ComponentModel
    
    Public Class Form1
    
        Private Property BoundData As BindingList(Of Data)
        Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
            Dim total As Integer
            Dim codigo As String
            Dim d As Data
    
            codigo = tbCodigoBase.Text
            total = Convert.ToInt32(tbTotal.Text)
    
            For i As Integer = 1 To total
                d = New Data()
                d.Id = String.Format("{0}-{1}", codigo, i)
                BoundData.Add(d)
            Next
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            BoundData = New BindingList(Of Data)()
            dgvData.DataSource = BoundData
        End Sub
    End Class
    

    El código asume que en el formulario hay un textbox llamado tbCodigoBase, otro tbTotal y un botón btnAdd.  Además, hay una grilla con AutoGenerateColumns activado (true) llamado dgvData.

    La clase que utilizo para llenar la grilla se llama Data:

    Public Class Data
    
        Public Property Id As String
        Public Property Data As String
    
    End Class
    

    Funciona perfectamente.  Nótese que omití el código que verifica que lo escrito en tbTotal sea un número válido y positivo.  Le recuerdo que usted debe hacer esta comprobación.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    • Marcado como respuesta Javier Roque viernes, 25 de mayo de 2018 21:19
    jueves, 17 de mayo de 2018 21:53
    Moderador
  • Ok obtengo esto campo vacio en la columna codigomuestra

    quizas sea porque no encuentro esta propiedad AutoGenerateColumns activado (true)

    Colocandolo como codigo nada igual sale vacio

    viernes, 18 de mayo de 2018 0:24
  • No, la propiedad AutoGenerateColumns no tiene que ver con su caso.  Lo que tiene que hacer es verificar cuál es el valor de la propiedad DataPropertyName de la columna CodigoMuestra.  Ese valor debe ser exactamente igual al nombre de la propiedad en la clase Registro que almacena el código generado.  No sé cómo se llama esta propiedad en su clase Registro pues no me la ha mostrado, pero en mi ejemplo esa propiedad se llama Id en la clase Data.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 18 de mayo de 2018 0:31
    Moderador
  • Ok estado revisando y no utilizo ID solo CodigoCadena,CodigoMuestra, porque es una grilla en modo diseño asi lo he generado 

    Respecto al dataproperty name no tengo nada eso esta vacio. no trabajo de esa forma todo el vinculo es por codigo.



    sábado, 19 de mayo de 2018 12:34
  • Ok, comience a trabajar vinculado a datos y verá que es mucho mejor.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    sábado, 19 de mayo de 2018 23:53
    Moderador
  • Ya lo e probado pero seria para cuando haga algo nuevo porque en algo que ya esta corriendo es volver a mover casi todo
    jueves, 24 de mayo de 2018 21:44
  • En un proyecto nuevo de Windows Forms con VB.net, agregué el siguiente código al formulario.

    Imports System.ComponentModel
    
    Public Class Form1
    
        Private Property BoundData As BindingList(Of Data)
        Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
            Dim total As Integer
            Dim codigo As String
            Dim d As Data
    
            codigo = tbCodigoBase.Text
            total = Convert.ToInt32(tbTotal.Text)
    
            For i As Integer = 1 To total
                d = New Data()
                d.Id = String.Format("{0}-{1}", codigo, i)
                BoundData.Add(d)
            Next
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            BoundData = New BindingList(Of Data)()
            dgvData.DataSource = BoundData
        End Sub
    End Class

    El código asume que en el formulario hay un textbox llamado tbCodigoBase, otro tbTotal y un botón btnAdd.  Además, hay una grilla con AutoGenerateColumns activado (true) llamado dgvData.

    La clase que utilizo para llenar la grilla se llama Data:

    Public Class Data
    
        Public Property Id As String
        Public Property Data As String
    
    End Class

    Funciona perfectamente.  Nótese que omití el código que verifica que lo escrito en tbTotal sea un número válido y positivo.  Le recuerdo que usted debe hacer esta comprobación.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    Hola Nuevamente disculpa estado haciendo todo de 0 si sale los valores pero sale -1 -2 yo quiero salga -01,-02 con el 0 y cuando es 10 salga normal pero 10,11 solo en el caso de 1,2,3,4,5,6,7,8,9 se anteponga el 0

    Ademas de ello quiero que una columna tenga valores codigos de numeros sin repetirse cada fila distinta de la otra que se genere tambien desde alli.

    es para un codigo usado en ediciones.

    jueves, 31 de mayo de 2018 3:39
  • Donde dice d.Id = String.Format("{0}-{1}", codigo, i), cambie a d.Id = String.Format("{0}-{1:N2}", codigo, i)


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT




    jueves, 31 de mayo de 2018 7:28
    Moderador
  • Ok otra cosita, he visto que cuando le digo cancelar registro que contiene este codidog

     Private Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles btnCancelar.Click
            Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                Call Limpiar()
    
                dgvDetalle.DataSource = ""
                dgvDetalle.DataSource = oDataTable
                dgvDetalle.DataSource = Nothing
                dgvDetalle.Refresh()
    
                txtBuscar.Text = Nothing
                If cnx.State = ConnectionState.Open Then
                    cnx.Close()
                End If
                Desactivado()
                contador_para_guardar = 1
                btnNuevo.Enabled = True
                btnGuardar.Enabled = False
                btnQuitar.Enabled = False
                btnCancelar.Enabled = False
    
            End Using
        End Sub

    luego le doy nuevo el boton para hacer generar ya no funciona tengo que cerrar todo el form y volver abrir para q funcione algo estoy haciendo mal?

    El codigo que me indica a modificar sale: 1805003-1.00 pero ya no importa mejor lo dejo igual solo digame como es el caso del boton cancelar inabilita el otro generar o add

    jueves, 31 de mayo de 2018 13:49
  • Bueno ya lo solucione lo q pones en el load lo puse al final de cancelar. Y normal lo unico malo es que si quisiera 5 filas y luego me equivoque y eran 6 se genera 5 mas 6 mas la idea es actualizar el existente y agregue el 6to.
    jueves, 31 de mayo de 2018 16:58