Introducción:
Este es el código de Visual Basic asociado al control de usuario WPF usado en
la
utilidad gsBuscarTexto.
'------------------------------------------------------------------------------
' OpcionesBuscar (07/Dic/07)
' Control de usuario WPF para las opciones de búsqueda
'
' ©Guillermo 'guille' Som, 2007
'------------------------------------------------------------------------------
Option Strict On
Option Infer Off
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows
Imports System.Windows.Controls
Imports System.Collections.Generic
Partial Public Class OpcionesBuscar
''' <summary>
''' Delegado para el evento que avisa cuando los expanders se han abierto o cerrado
''' </summary>
''' <remarks>
''' En Visual Basic no hace falta definirlo, pero...
''' </remarks>
Public Delegate Sub ExpanderExpandChangedEventHandler()
''' <summary>
''' Evento para indicar que se ha expandido o contraido los expanders
''' </summary>
''' <remarks></remarks>
Public Event ExpanderExpandedChanged As ExpanderExpandChangedEventHandler
Private m_EnEjecucion As Boolean = False
''' <summary>
''' Para asignar manualmente los manejadores de eventos
''' ya que me daba error en el diseñador de formularios
''' porque el objeto no estaba creado (al producirse los eventos del control)
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property EnEjecucion() As Boolean
Get
Return m_EnEjecucion
End Get
Set(ByVal value As Boolean)
m_EnEjecucion = value
If m_EnEjecucion Then
AddHandler chkBuscar.Checked, AddressOf chkBuscar_Checked
AddHandler chkBuscar.Unchecked, AddressOf chkBuscar_Checked
AddHandler chkPoner.Checked, AddressOf chkPoner_Checked
AddHandler chkPoner.Unchecked, AddressOf chkPoner_Checked
AddHandler chkFecha.Checked, AddressOf chkFecha_Checked
AddHandler chkFecha.Unchecked, AddressOf chkFecha_Checked
chkPoner_Checked(Nothing, Nothing)
chkBuscar_Checked(Nothing, Nothing)
chkFecha_Checked(Nothing, Nothing)
Else
RemoveHandler chkBuscar.Checked, AddressOf chkBuscar_Checked
RemoveHandler chkBuscar.Unchecked, AddressOf chkBuscar_Checked
RemoveHandler chkPoner.Checked, AddressOf chkPoner_Checked
RemoveHandler chkPoner.Unchecked, AddressOf chkPoner_Checked
RemoveHandler chkFecha.Checked, AddressOf chkFecha_Checked
RemoveHandler chkFecha.Unchecked, AddressOf chkFecha_Checked
End If
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo indicado como una cadena (string)
''' con cada elemento del combo separado por la barra vertical
''' </summary>
''' <returns></returns>
''' <remarks>
''' Esta función se usa internamente en este control
''' para devolver los contenidos de los diferentes controles
''' </remarks>
Private Function cbo2String(ByVal cbo As ComboBox) As String
Dim lista As New List(Of String)
For Each s As String In cbo.Items
lista.Add(s)
Next
Return String.Join("|", lista.ToArray())
End Function
''' <summary>
''' Asigna la cadena con los elementos a asignar al combo indicado.
''' Cada elemento estará separado por una barra vertical
''' </summary>
''' <param name="datos">
''' La cadena con los elementos sepados por una barra vertical
''' </param>
''' <param name="cbo">
''' El comboBox al que se asignarán esos elementos
''' </param>
''' <remarks>
''' Este método se usa internamente en este control
''' para asignar una cadena a cada uno de los combos usados
''' </remarks>
Private Sub string2Cbo(ByVal datos As String, ByVal cbo As ComboBox)
Dim ar() As String = datos.Split("|".ToCharArray, _
StringSplitOptions.RemoveEmptyEntries)
cbo.Items.Clear()
For Each s As String In ar
cbo.Items.Add(s)
Next
End Sub
''' <summary>
''' Devuelve el contenido del combo cboDir
''' </summary>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Directorios() As String
Get
Return cbo2String(cboDir)
End Get
Set(ByVal value As String)
string2Cbo(value, cboDir)
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo cboFiltro
''' </summary>
''' <value></value>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Filtros() As String
Get
Return cbo2String(cboFiltro)
End Get
Set(ByVal value As String)
string2Cbo(value, cboFiltro)
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo cboBuscar1
''' </summary>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Buscar1() As String
Get
Return cbo2String(cboBuscar1)
End Get
Set(ByVal value As String)
string2Cbo(value, cboBuscar1)
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo cboBuscar2
''' </summary>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Buscar2() As String
Get
Return cbo2String(cboBuscar2)
End Get
Set(ByVal value As String)
string2Cbo(value, cboBuscar2)
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo cboPoner1
''' </summary>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Poner1() As String
Get
Return cbo2String(cboPoner1)
End Get
Set(ByVal value As String)
string2Cbo(value, cboPoner1)
End Set
End Property
''' <summary>
''' Devuelve el contenido del combo cboPoner2
''' </summary>
''' <returns>
''' Un string en el que cada elemento está separado por una barra vertical
''' </returns>
''' <remarks></remarks>
Public Property Poner2() As String
Get
Return cbo2String(cboPoner2)
End Get
Set(ByVal value As String)
string2Cbo(value, cboPoner2)
End Set
End Property
''' <summary>
''' Actualizar el contenido de los combos
''' de forma que si el texto no está en los elementos (Items)
''' se añada a la lista
''' </summary>
''' <remarks></remarks>
Public Sub ActualizarCombos()
With cboDir
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
With cboFiltro
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
With cboBuscar1
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
With cboBuscar2
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
With cboPoner1
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
With cboPoner2
If .Items.Contains(.Text) = False Then
.Items.Add(.Text)
End If
End With
End Sub
''' <summary>
''' Para llamar al evento Click del botón desde fuera de la clase
''' </summary>
''' <remarks></remarks>
Public Sub btnExaminarClick()
btnExaminarDir_Click(Nothing, Nothing)
End Sub
''' <summary>
''' Seleccionar el directorio en el que se hará la búsqueda inicial
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub btnExaminarDir_Click(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
Handles btnExaminarDir.Click
Dim oFD As New System.Windows.Forms.FolderBrowserDialog
With oFD
.Description = "Seleccionar el directorio de búsqueda"
.RootFolder = Environment.SpecialFolder.MyComputer
' Si el texto tiene varios directorios,
' usar solo el primero
If Me.cboDir.Text.Contains(";") Then
Dim i As Integer = Me.cboDir.Text.IndexOf(";")
.SelectedPath = Me.cboDir.Text.Substring(0, i)
Else
.SelectedPath = Me.cboDir.Text
End If
If .ShowDialog = System.Windows.Forms.DialogResult.OK Then
' Si ya había un texto en el combo, agregarlo al final
If String.IsNullOrEmpty(Me.cboDir.Text) = False Then
Me.cboDir.Text &= "; " & .SelectedPath
Else
Me.cboDir.Text = .SelectedPath
End If
End If
End With
End Sub
''' <summary>
''' Cuando la operación de Drag & Drop entra
''' en expanderFicheros o en cboDir
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub cboDir_DragEnter(ByVal sender As Object, _
ByVal e As System.Windows.DragEventArgs) _
Handles cboDir.DragEnter, expanderFichero.DragEnter
' Si hay datos de arrastrar y soltar, permitirlo
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effects = DragDropEffects.Copy
End If
End Sub
''' <summary>
''' Cuando se suelta el fichero
''' en expanderFicheros o en cboDir
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub cboDir_Drop(ByVal sender As Object, _
ByVal e As System.Windows.DragEventArgs) _
Handles cboDir.Drop, expanderFichero.Drop
' Si hay datos de arrastrar y soltar, asignarlo al combo del directorio
' (al arrastrar, no se tiene en cuenta si ya había algo en el texto)
If e.Data.GetDataPresent("FileDrop") Then
Me.cboDir.Text = CType(e.Data.GetData("FileDrop", True), String())(0)
End If
End Sub
''' <summary>
''' Cuando se produce el evento Checked o Unchecked del chkPoner,
''' habilitar adecuadamente los combos del texto a poner
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub chkPoner_Checked(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
'Handles chkPoner.Checked, chkPoner.Unchecked
If m_EnEjecucion = False Then Exit Sub
Dim b As Boolean = chkPoner.IsChecked.Value
cboPoner1.IsEnabled = b
cboPoner2.IsEnabled = b
End Sub
''' <summary>
''' Cuando se produce el evento Checked o Unchecked del chkBuscar,
''' habilitar adecuadamente los combos del texto a buscar,
''' también se asigna el texto del expander para indicar si se busca texto o no
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub chkBuscar_Checked(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
'Handles chkBuscar.Checked, chkBuscar.Unchecked
If m_EnEjecucion = False Then Exit Sub
Dim b As Boolean = chkBuscar.IsChecked.Value
cboBuscar1.IsEnabled = b
cboBuscar2.IsEnabled = b
cboTipoBuca.IsEnabled = b
chkPoner.IsEnabled = b
cboPoner1.IsEnabled = b
cboPoner2.IsEnabled = b
If chkPoner.Tag IsNot Nothing AndAlso CBool(chkPoner.Tag) = False Then
chkPoner.IsChecked = False
chkPoner.IsEnabled = False
cboPoner1.IsEnabled = False
cboPoner2.IsEnabled = False
End If
If b Then
chkPoner_Checked(Nothing, Nothing)
expanderBuscar.Header = "Texto a buscar"
Else
expanderBuscar.Header = "Texto a buscar (sin buscar texto)"
End If
End Sub
''' <summary>
''' Cuando se produce el evento Checked o Unchecked del chkFecha,
''' habilitar adecuadamente el texto de la fecha a usar en la búsqueda,
''' si no hay fecha, se pone el cursor en el control de la fecha
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub chkFecha_Checked(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
'Handles chkFecha.Checked, chkFecha.Unchecked
If m_EnEjecucion = False Then Exit Sub
Me.txtFecha.IsEnabled = chkFecha.IsChecked.Value
' Si se indica usar la fecha y está en blanco
' asignar la fecha actual y posicionar el cursor en la caja de textos
If txtFecha.IsEnabled AndAlso String.IsNullOrEmpty(txtFecha.Text) Then
txtFecha.Text = DateTime.Now.ToShortDateString
txtFecha.SelectAll()
txtFecha.Focus()
End If
End Sub
' Cuando se expanden los expanders, hacer visibles los grid
' Cuando se contraen los expanders, contraer los grids
' con idea de que se asignen los tamaños
' ya que el control sigue midiendo lo mismo, pero así puedo saber el espacio que ocupa.
'
' Lo que se hace en cada caso es
' asignar a la propiedad Visibility del Grid correspondiente el valor adecuado
' para ocultarlo (contraer) o mostrarlo.
' Si se contraen (evento Collapsed)
' contraer el grid asignando a la propiedad Visibility el valor Visibilty.Collapsed.
' Si se expanden (evento Expanded)
' mostrar el grid asignando a la propiedad Visibility el valor Visibility.Visible.
Private Sub expanderBuscar_Collapsed(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
Handles expanderBuscar.Collapsed
If m_EnEjecucion = False Then Exit Sub
Me.gridTexto.Visibility = System.Windows.Visibility.Collapsed
RaiseEvent ExpanderExpandedChanged()
End Sub
Private Sub expanderBuscar_Expanded(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
Handles expanderBuscar.Expanded
If m_EnEjecucion = False Then Exit Sub
Me.gridTexto.Visibility = System.Windows.Visibility.Visible
RaiseEvent ExpanderExpandedChanged()
End Sub
Private Sub expanderFichero_Collapsed(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
Handles expanderFichero.Collapsed
If m_EnEjecucion = False Then Exit Sub
Me.gridFichero.Visibility = System.Windows.Visibility.Collapsed
RaiseEvent ExpanderExpandedChanged()
End Sub
Private Sub expanderFichero_Expanded(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _
Handles expanderFichero.Expanded
If m_EnEjecucion = False Then Exit Sub
Me.gridFichero.Visibility = System.Windows.Visibility.Visible
RaiseEvent ExpanderExpandedChanged()
End Sub
End Class