martes, 6 de marzo de 2012

Agregar filas nuevas con código

 Dim i As Integer
        If DataTable1DataGridView.Rows.Count > 0 Then
            For i = 0 To DataTable1DataGridView.Rows.Count - 2
                Dim nuevafila As DataRow = SuperDataSet.Tables("DetallesPedido").NewRow
                nuevafila.Item("IdPedido") = DataTable1DataGridView.Rows(i).Cells(0).Value
                nuevafila.Item("IdProducto") = DataTable1DataGridView.Rows(i).Cells(1).Value
                nuevafila.Item("Cantidad") = DataTable1DataGridView.Rows(i).Cells(3).Value

                SuperDataSet.Tables("DetallesPedido").Rows.Add(nuevafila)
            Next

        End If

Calcular datos dentro de celdas

 Private Sub DataTable1DataGridView_CellEndEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataTable1DataGridView.CellEndEdit
        If e.ColumnIndex = 3 Then
            DataTable1DataGridView.CurrentRow.Cells(4).Value = DataTable1DataGridView.CurrentRow.Cells(2).Value * DataTable1DataGridView.CurrentRow.Cells(3).Value
        End If
    End Sub

Encontrar e insertar un dato en un datagridview después de dejar una celda

    Private Sub DataTable1DataGridView_CellLeave(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataTable1DataGridView.CellLeave
        If e.ColumnIndex = 1 Then
            Dim fila As Integer = ProductosBindingSource.Find("NombreProducto", DataTable1DataGridView.CurrentCell.EditedFormattedValue)

            ProductosBindingSource.Position = fila
            DataTable1DataGridView.CurrentRow.Cells(2).Value = SuperDataSet.Tables("Productos").Rows(fila).Item("Precio")
        End If
    End Sub

Primero se le asigna a fila la posición de esa fila en la tabla de donde queremos coger el dato
Luego asignamos a la celda (en este caso la 2 es precio) el valor de la tabla productos de la fila (fila que es el indice que hemos cogido antes) y de la fila la propiedad llamada precio, con lo cual cogerá el precio del nombre de producto que hemos seleccionado en la tabla origen

Filtro entre fechas y ordenado por un campo

 DataView1.Table = SuperDataSet.Tables("Pedidos")
        DataView1.RowFilter = "FechaPedido >='" & CDate(TextBox1.Text) & "' and Fechapedido <='" & CDate(TextBox2.Text) & "'"
        DataView1.Sort = "IdEmpleado"
        PedidosDataGridView.DataSource = DataView1

hay que convertir los .text en fecha

Filtrar datos con el dataview

 DataView1.Table = SuperDataSet.Tables("Compras")
        DataView1.RowFilter = "Recibido=False"
        ComprasDataGridView.DataSource = DataView1

Acuerdate de agregar el componente dataview al cuadro de herramientas de datos

Mostrar otro campo en un combobox con una tabla relacionada

En las propiedades en databindings

SelectedValue será el campo original de la tabla presente

Text será el campo que queramos relacionar (si tenemos un id, y preferimos que se vea el campo nombre)

DataSource la otra tabla, la original del dato que queremos mostrar (la que no está presente en el formulario)

Displaymember, elegimos el campo que queremos mostrar (aquí es mas fácil porqué nos mostrara solo los campos de la tabla datasource escogida)

Valuemember, el campo clave, el que tiene que ir relacionado con el selectedvalue de la otra tabla (también es "fácil" porque nos mostrará solo los campos de la tabla datasource)

Hacer una búsqueda de un registro

   Dim posicion As Integer
        posicion = ClientesBindingSource.Find(ToolStripComboBox1.SelectedItem.ToString, ToolStripTextBox1.Text)

        If posicion <> -1 Then
            ClientesBindingSource.Position = posicion
        Else
            MessageBox.Show("Ese cliente no existe")
        End If

Cargando los nombres de los campos de una tabla en un combobox

 For i = 0 To SuperDataSet.Clientes.Count - 1
            ToolStripComboBox1.Items.Add(SuperDataSet.Clientes.Columns.Item(i))
        Next

domingo, 4 de marzo de 2012

Gestión de errores --- Try Catch

  Try
            EmpleadoBindingSource.EndEdit()
            OleDbDataAdapter1.Update(DataSet11, "Empleado")

        Catch ex As OleDb.OleDbException
            MessageBox.Show(ex.Message.ToString)

        Catch ex As ConstraintException
            MessageBox.Show(ex.Message.ToString)

        Catch ex As NoNullAllowedException
            MessageBox.Show(ex.Message.ToString)

        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString)
        End Try

sábado, 3 de marzo de 2012

Otra forma de moverse entre datos y datagridviews

Si no podemos navegar entre los datagridviews con el control bindingsource (bindingsource1.movenext())

tenemos este otro sistema


 Private Sub bprimero_Click(sender As System.Object, e As System.EventArgs) Handles bprimero.Click
        DataGridView1.CurrentCell = DataGridView1(0, 0)
        Label1.Text = "Registro " & DataGridView1.CurrentCell.RowIndex + 1 & " de " & DataGridView1.Rows.Count
    End Sub

    Private Sub banterior_Click(sender As System.Object, e As System.EventArgs) Handles banterior.Click
        DataGridView1.CurrentCell = DataGridView1(0, DataGridView1.CurrentCell.RowIndex - 1)
        Label1.Text = "Registro " & DataGridView1.CurrentCell.RowIndex + 1 & " de " & DataGridView1.Rows.Count
    End Sub

    Private Sub bsiguiente_Click(sender As System.Object, e As System.EventArgs) Handles bsiguiente.Click
        DataGridView1.CurrentCell = DataGridView1(0, DataGridView1.CurrentCell.RowIndex + 1)
        Label1.Text = "Registro " & DataGridView1.CurrentCell.RowIndex + 1 & " de " & DataGridView1.Rows.Count
    End Sub

    Private Sub bultimo_Click(sender As System.Object, e As System.EventArgs) Handles bultimo.Click
        DataGridView1.CurrentCell = DataGridView1(0, DataGridView1.Rows.Count - 1)
        Label1.Text = "Registro " & DataGridView1.CurrentCell.RowIndex + 1 & " de " & DataGridView1.Rows.Count
    End Sub

viernes, 2 de marzo de 2012

Crear relación maestro detalle

 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        OleDbDataAdapter1.Fill(DataSet11, "Tipo De Producto")
        OleDbDataAdapter2.Fill(DataSet11, "Producto")

        DataSet11.Relations.Add("Relacionproductos", DataSet11.Tables("Tipo de producto").Columns("Product type ID"), DataSet11.Tables("Producto").Columns("ID del tipo de producto"))

        Me.DataGridView1.DataSource = DataSet11
        Me.DataGridView1.DataMember = "Tipo de producto"

        Me.DataGridView2.DataSource = DataSet11
        Me.DataGridView2.DataMember = "Tipo de producto.Relacionproductos"

    End Sub


después de cargar los dataadapters, creo una relación, cogiendo tipo de producto como tabla maestra y producto como la tabla detalle, relacionándolas por el registro en común, después al primer datagridview le pongo de datasource el dataset11 y de datamember la tabla tipo de producto, y para el datagridview2 el datamember cambia a ser el de tipo de producto.relacionproductos siendo relacionproductos la relación que acabamos de crear

martes, 28 de febrero de 2012

Acciones con el BindingSource

Acciones que podemos hacer con un bindingsource

 Ir al siguiente registro -----> EmpleadoBindingSource.MoveNext()
 Ir al anterior registro -----> EmpleadoBindingSource.MovePrevious()
Ir al primero registro -------> EmpleadoBindingSource.MoveFirst()
Ir al último registro ---------> EmpleadoBindingSource.MoveLast()

Añade un nuevo registro -------->   EmpleadoBindingSource.AddNew()
Borra el registro seleccionado actual -------> EmpleadoBindingSource.RemoveCurrent()

Guarda los cambios ---->

         EmpleadoBindingSource.EndEdit()    (Termina la edición y guarda los cambios)
        OleDbDataAdapter1.Update(DataSet11)  (Guarda esos cambios en la base de datos)

lunes, 27 de febrero de 2012

Conexión a base de datos forma 2 bd2

Arrastrar un Datagridview

Elegir origen de datos --> Agregar origen de datos de proyecto....

Se crea un Dataset un BindingSource y un TableAdapter

El evento de rellenar del load se ha generado solo

Conexión a base de datos forma 1 bd1

Agregar los elementos oledb desde la pestaña datos del cuadro de herramientas

Explorador de Servidores -->Conexiones de datos --> Agregar conexión
 Archivos de bases de datos de Microsoft Access (en este caso)

Arrastrar oledbdataadapter sobre el formulario, después de configurar se crea un OLedbconecction

Datos--> Generar conjunto de datos (se genera el dataset)

Arrastramos un datagridview --> Tareas de DatagridView y lo enlazamos a la tabla  (se crea el componente bindingsource)

rellenar los datos en el dataadapter con el dataset en el evento load


 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        OleDbDataAdapter1.Fill(DataSet11, "Clientes")
    End Sub

domingo, 26 de febrero de 2012

LastIndexOf y substring

Lastindexof sirve para indicar la posición del ultimo carácter que hallamos indicado de una cadena
Substring es para obtener una subcadena dentro de un texto


 Dim texto As String
        Dim precio As Double
        Dim num As Integer
        Dim articulo As String
        texto = e.Data.GetData(DataFormats.Text).ToString
        num = texto.LastIndexOf(" ")
        precio = texto.Substring(num)
        articulo = texto.Substring(0, num)
        precio = precio + (precio * 0.1)
        texto = articulo & " " & precio
        Listventas.Items.Add(texto)
        Texttotal.Text = Texttotal.Text + precio


Con esto estamos cogiendo un precio que está separado por un texto entre un espacio, que podría ser ("Galletas 4") así num coge la posición del espacio, precio empieza a coger los caracteres desde ese espacio (el 4) y articulo coge desde la posición 0 hasta la posicion num ("Galletas") luego aumento el precio un 10% y vuelvo a pegar el texto


 Dim texto As String
        Dim precio As Double
        Dim num As Integer
        Dim articulo As String
        Dim precioaumentado As Double
        texto = e.Data.GetData(DataFormats.Text).ToString
        num = texto.LastIndexOf(" ")
        precio = texto.Substring(num)
        articulo = texto.Substring(0, num)
        precioaumentado = (precio * 100) / 110
        texto = articulo & " " & precioaumentado
        Listalmacen.Items.Add(texto)
        Texttotal.Text = Texttotal.Text - precio

este código lo que haces es devolver el precio a su estado original (quitándole el 10% del principio)

Arrastrar y soltar (DoDragDrop, DragEnter,DragDrop)

Primero de todo hay que elegir el objeto que se desea arrastrar y darle una condición del efecto (copiar,cortar...) en este caso copiar


Private Sub Listalmacen_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Listalmacen.MouseDown
        Listalmacen.DoDragDrop(Listalmacen.SelectedItem.ToString, DragDropEffects.Copy)
    End Sub

Al objeto de destino hay que ponerle la propiedad de AllowDrop a true

Después al objeto de destino hay que darle la opción de mirar que datos se están aceptando


  Private Sub Listventas_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Listventas.DragEnter
        If (e.Data.GetDataPresent(DataFormats.Text)) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

Y lo siguiente es aceptar los datos


 Private Sub Listventas_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Listventas.DragDrop
        Listventas.Items.Add(e.Data.GetData(DataFormats.Text).ToString)
    End Sub

viernes, 24 de febrero de 2012

Compartir eventos con código (AddHandler, Adressof)

Cuando añadimos por ejemplo un nuevo toolstripmenuitem, y queremos que tenga el mismo evento click ya creado procederemos a AddHandler y Adressof


 Dim texto As String = ""
        Dim num As Integer
        Dim nuevotam As ToolStripMenuItem
        texto = InputBox("Introduce un tamaño de 8 a 40", "Tamaño")

        If IsNumeric(texto) Then

            If texto >= 8 And texto <= 40 And IsNumeric(num) Then

                Dim repe As Boolean
                Dim insertado As Boolean = False
                repe = repetido(texto)
                If repe = False Then
                    Dim i As Integer = 0
                    Do While i <= ContextMenuStrip2.Items.Count - 3 And insertado = False
                        If CDbl(texto) < ContextMenuStrip2.Items.Item(i).Text Then
                            nuevotam = New ToolStripMenuItem
                            nuevotam.Text = texto
                            Label1.Font = New System.Drawing.Font(fuente, CInt(nuevotam.Text), estilo)
                            ContextMenuStrip2.Items.Insert(i, nuevotam)
                            AddHandler nuevotam.Click, AddressOf ToolStripMenuItem2_Click
                            insertado = True
                        Else
                            i = i + 1
                        End If
                    Loop
                    If insertado = False Then

                        nuevotam = New ToolStripMenuItem
                        nuevotam.Text = texto
                        Label1.Font = New System.Drawing.Font(fuente, CInt(nuevotam.Text), estilo)
                        ContextMenuStrip2.Items.Insert(ContextMenuStrip2.Items.Count - 2, nuevotam)
                        AddHandler nuevotam.Click, AddressOf ToolStripMenuItem2_Click
                    End If
                Else
                    MessageBox.Show("Tamaño repetido")
                End If
            Else
                MessageBox.Show("Error #459215E2: El valor introducido no es un valor válido")
            End If
   
        End If


Como podemos ver, estamos creando un nuevo toolstripmenuitem para insertarlo, darle el formato al label1, con las características (el tamaño) de este, y después compartimos el evento click con un evento ya existente

martes, 21 de febrero de 2012

Fuente, tamaño y estilo

Para cambiar el estilo de un texto (en esta entrada la fuente)


       Dim fuente As String = Label1.Font.Name
        Dim tamanyo As Integer = Label1.Font.Size
        Dim estilo As FontStyle = Label1.Font.Style

        Label1.Font = New System.Drawing.Font(CStr(sender.text), tamanyo, estilo)

guardamos el estilo por defecto del label y luego le volvemos a darle el mismo estilo, cambiando la fuente por sender.text (que en este caso podría ser arial,verdana...)

lunes, 20 de febrero de 2012

Ismdicontainer y mdiparent

para hacer un form como el principal y los demás que se puedan abrir dentro de este, lo primero de todo es poner la propiedad del formulario IsMdiContainer a true después para abrir un formulario dentro de este habría que escribir este código dentro de un button o similar


 Private Sub TextoToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles TextoToolStripMenuItem.Click
        formtexto.MdiParent = Me
        formtexto.Show()
        TextoToolStripMenuItem.Enabled = False
    End Sub

en este caso es un botón de menu que no se podrá pulsar después, y conseguimos que se muestre el formulario formtexto

domingo, 19 de febrero de 2012

Tabcontrol, controls, format y ctype

Con el siguiente código se puede ver como recoger los diferentes objetos dentro de las pestañas de un tabcontrol, para controlarlo mas solo va a coger los checkbox y radiobuttons y los mostrará en dos listas, uno con el nombre del tab y del articulo y en la otra lista el precio con formato 0.00 para el que usamos format, con ctype convertimos los controls en checkbox o radiobutton para poder acceder a sus propiedades .checked


 For i = 0 To TabControl1.Controls.Count - 1
            For j = 0 To TabControl1.Controls(i).Controls.Count - 1
                If TypeOf TabControl1.Controls(i).Controls(j) Is RadioButton Then
                    If CType(TabControl1.Controls(i).Controls(j), RadioButton).Checked = True Then
                        Lista1.Items.Add(TabControl1.Controls(i).Text & " " & CType(TabControl1.Controls(i).Controls(j), RadioButton).Text)
                        Lista2.Items.Add(Format(CDbl(CType(TabControl1.Controls(i).Controls(j), RadioButton).Tag), "#,###.00"))
                        TextBox1.Text = TextBox1.Text + CDbl(CType(TabControl1.Controls(i).Controls(j), RadioButton).Tag)
                    End If

                Else
                    If TypeOf TabControl1.Controls(i).Controls(j) Is CheckBox Then
                        If CType(TabControl1.Controls(i).Controls(j), CheckBox).Checked = True Then
                            Lista1.Items.Add(TabControl1.Controls(i).Text & " " & CType(TabControl1.Controls(i).Controls(j), CheckBox).Text)
                            Lista2.Items.Add(Format(CDbl(CType(TabControl1.Controls(i).Controls(j), CheckBox).Tag), "#,###.00"))
                            TextBox1.Text = TextBox1.Text + CDbl(CType(TabControl1.Controls(i).Controls(j), CheckBox).Tag)
                        End If
                    End If
                End If
            Next
        Next

jueves, 16 de febrero de 2012

Sender, TypeOf y tag

Con este ejemplo se puede ver que se puede compartir el mismo evento para diferentes objetos, el objeto se desenlaza con el evento y se pasa a llamar sender que será el objeto que desencadene la opción y con el typeof podemos comprobar dentro de que clase de objeto se trata


    Private Sub Rsopa_Click(sender As System.Object, e As System.EventArgs) Handles Rsopa.Click, Rternera.Click, Rpollo.Click, Rpescado.Click, Rnatillas.Click, Rmacarrones.Click, Rhelado.Click, Rfruta.Click, Rflan.Click, Rarroz.Click, Cvino.Click, Cpan.Click, Cagua.Click, Combocafe.Click, Combocafe.SelectedIndexChanged
        If TypeOf sender Is RadioButton Then
            Me.Text = "Menú: " & sender.text & " " & sender.tag
            Ttotal.Text = CDbl(Ttotal.Text) + CDbl(sender.tag)
        End If

        If TypeOf sender Is CheckBox Then
            Me.Text = "Varios: " & sender.text & " " & sender.tag
            Ttotal.Text = CDbl(Ttotal.Text) + CDbl(sender.tag)
        End If

        If sender Is Combocafe Then
            If Combocafe.SelectedItem = "Sí" Then
                Me.Text = "Cafe" & " " & sender.tag
                Ttotal.Text = CDbl(Ttotal.Text) + CDbl(sender.tag)
            End If
        End If
    End Sub

el tag es una propiedad de cualquier objeto para almacenar un dato, en este ejemplo se almacena el precio

martes, 14 de febrero de 2012

Anular selección de un listbox

 Dim i As Integer
        For i = 0 To ListBox1.Items.Count - 1
            If ListBox1.GetSelected(i) = True Then
                ListBox1.SetSelected(i, False)
            End If
        Next

sábado, 11 de febrero de 2012

Keydown y e.keycode

Para controlar entradas de teclado especiales como la tecla enter o escape se llama al evento keydown (se puede ver la utilidad del keypress en la entrada anterior

Un ejemplo de como controlar el enter y el escape (en este caso con el enter pasamos de un control a otro y el escape cerrara el programa


  If e.KeyCode = Keys.Enter Then
            If txtOperando1.Focused = True Then
                txtOperando2.Focus()
            Else
                txtOperando1.Focus()
            End If
        End If

        If e.KeyCode = Keys.Escape Then
            Me.Close()
        End If

lunes, 6 de febrero de 2012

Keypress y e.handled

Si no queremos que se pueda pulsar una tecla que no sea numero o , coma (para una calculadora por ejemplo)

basta con este código


 If IsNumeric(e.KeyChar) = False And e.KeyChar <> "," Then
            e.Handled = True
        End If


Pistas:
Recuerda que es and, si pusiera un or nunca se cumpliría la excepción
El e.handled hay que ponerlo a true, así no se podrá escribir una letra por ejemplo