<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cuberterías de Albacete, I&#38;E &#187; Visual Basic 2005</title>
	<atom:link href="http://cda-ie.es/category/informatica/vb2005/feed/" rel="self" type="application/rss+xml" />
	<link>http://cda-ie.es</link>
	<description>Desde 2021 ofreciéndole el mejor servicio</description>
	<lastBuildDate>Mon, 21 May 2012 20:06:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Llenar un ComboBox IV</title>
		<link>http://cda-ie.es/2008/02/19/llenar-un-combobox-iv/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=llenar-un-combobox-iv</link>
		<comments>http://cda-ie.es/2008/02/19/llenar-un-combobox-iv/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 18:48:42 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2008/02/19/llenar-un-combobox-iv/</guid>
		<description><![CDATA[Última entrega. Por fin lo útil: llenar el Combo, el ListBox y alguna cosita más. El corazón de la clase son dos métodos privados que son los que rellenan el ListControl (ya sea un ListBox o un ComboBox). Ambos reciben como parámetros el control que se va a rellenar, el nombre de la tabla origen, [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Última entrega. Por fin lo útil: llenar el Combo, el ListBox y alguna cosita más.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">El corazón de la clase son dos métodos privados que son los que rellenan el ListControl (ya sea un ListBox o un ComboBox). Ambos reciben como parámetros el control que se va a rellenar, el nombre de la tabla origen, los dos campos con los que vamos a rellenar el control (indentificados por su índice en la colección de columnas de la tabla, o su posición, para entendernos), una sentencia WHERE para ajustar la consulta y una sentencia de ordenación, ambas sin las palabras reservadas WHERE y ORDER BY. El método para OleDB es el siguiente:</span></p>
<p><span id="more-29"></span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">Private</span> <span style="color: #0000ff">Function</span> RellenarComboOleDB( _
        <span style="color: #0000ff">ByVal</span> MiControl <span style="color: #0000ff">As</span> System.Windows.Forms.ListControl, _
        <span style="color: #0000ff">ByVal</span> Tabla <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, <span style="color: #0000ff">ByVal</span> ClavePrincipal <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span>, _
        <span style="color: #0000ff">ByVal</span> CampoDescriptor <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span>, _
        <span style="color: #0000ff">ByVal</span> SentenciaWhere <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, _
        <span style="color: #0000ff">ByVal</span> SentenciaOrderBy <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>) <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> drDatos <span style="color: #0000ff">As</span> OleDb.OleDbDataReader
    <span style="color: #0000ff">Dim</span> Comando <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> OleDb.OleDbCommand(<span style="color: #b22222">"SELECT * FROM "</span> &amp; Tabla, _
                                    <span style="color: #0000ff">Me</span>._cnOleDb)
    <span style="color: #0000ff">Dim</span> tbTabla <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> DataTable
    <span style="color: #0000ff">Dim</span> deVuelta <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Try</span>
        <span style="color: #0000ff">If</span> SentenciaWhere.Length &gt; 0 <span style="color: #0000ff">Then</span>
            Comando.CommandText = <span style="color: #b22222">"SELECT * FROM "</span> &amp; Tabla _
                    &amp; <span style="color: #b22222">" WHERE "</span> &amp; SentenciaWhere
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
        <span style="color: #0000ff">If</span> SentenciaOrderBy.Length &gt; 0 <span style="color: #0000ff">Then</span>
            Comando.CommandText = Comando.CommandText &amp; _
                    <span style="color: #b22222">" ORDER BY "</span> &amp; SentenciaOrderBy
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
        drDatos = Comando.ExecuteReader()
        tbTabla.Load(drDatos, LoadOption.OverwriteChanges)
        MiControl.DataSource = tbTabla
        MiControl.DisplayMember = _
            tbTabla.Columns.Item(CampoDescriptor).Caption
        MiControl.ValueMember = _
            tbTabla.Columns.Item(ClavePrincipal).Caption
        drDatos.Close()
        deVuelta = <span style="color: #0000ff">True</span>
    <span style="color: #0000ff">Catch</span> NoConexion <span style="color: #0000ff">As</span> InvalidOperationException
        <span style="color: #008000">'Error del Comado.ExecuteReader</span>
        deVuelta = <span style="color: #0000ff">False</span>
        <span style="color: #0000ff">Throw</span> NoConexion
    <span style="color: #0000ff">Catch</span> NoConexion <span style="color: #0000ff">As</span> Exception
        deVuelta = <span style="color: #0000ff">False</span>
        <span style="color: #0000ff">Throw</span> NoConexion
    <span style="color: #0000ff">Finally</span>
        Comando = <span style="color: #0000ff">Nothing</span>
        tbTabla = <span style="color: #0000ff">Nothing</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Try</span>
    <span style="color: #0000ff">Return</span> deVuelta
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Para SQL es similar, pues sólo cambian el nombre (RellenarComboSQL), el tipo de objeto DataReader,  el Command y la conexión utilizada, es decir, en vez de:</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">Dim</span> drDatos <span style="color: #0000ff">As</span> OleDb.OleDbDataReader
<span style="color: #0000ff">Dim</span> Comando <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> OleDb.OleDbCommand(<span style="color: #b22222">"SELECT * FROM "</span> &amp; Tabla, _
        <span style="color: #0000ff">Me</span>._cnOleDb)</pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Tendríamos:</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">Dim</span> drDatos <span style="color: #0000ff">As</span> SqlClient.SqlDataReader
<span style="color: #0000ff">Dim</span> Comando <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> SqlClient.SqlCommand(<span style="color: #b22222">"SELECT * FROM "</span> &amp; Tabla, _
        <span style="color: #0000ff">Me</span>._cnSQL)</pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Como métodos públicos tenemos dos variantes, donde jugamos con la sobrecarga de operadores. El primero, que se muestra a continuación, es el principal. En él asumimos que la conexión ya está abierta, bien porque hemos llamado previamente al método <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">Conectar</span>, bien porque le hemos pasado un objeto conexión a través de la propiedad <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">ConexionOleDB</span> o <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">ConexionSQL</span>. Como puede verse, los parámetros que recibe son los mismos que reciben los métodos privados vistos antes, con la salvedad de que, salvo el control y el nombre de la tabla, los demás son opcionales. En lo que a mí respecta, la situación más habitual para la que estoy usando esta clase es para rellenar combos con tablas que no tienen más de 10-15 registros y tres campos: por orden, IdTabla, Nombre y Descripción, siendo los dos primeros los campos a mostrar en el combo. De ahí los valores por defecto de los parámetros opcionales.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Lo que hace el método es identificar con qué base de datos estamos tratando y llamar al método privado correspondiente, pasándole por parámetro lo que a él le ha llegado.</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Rellena un ListControl con un campo descriptor </span>
<span style="color: #5c5c5c">''' y la clave principal de una tabla</span>
<span style="color: #5c5c5c">''' para usarlo como clave externa en otra tabla.</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="MiControl"&gt;ListControl (Combo, ListBox)</span>
<span style="color: #5c5c5c">''' que se va a rellenar&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="Tabla"&gt;Nombre de la tabla a rellenar&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="ClavePrincipal"&gt;Número del campo Clave Principal</span>
<span style="color: #5c5c5c">''' en la tabla (por defecto, 0)&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="CampoDescriptor"&gt;Número del campo descriptor</span>
<span style="color: #5c5c5c">''' usado como DisplayMember del Combo (por defecto, el 1)&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="SentenciaWhere"&gt;Sentencia WHERE de la selección</span>
<span style="color: #5c5c5c">''' SQL (sin el WHERE). Puede incluir más opciones, como ORDER BY.</span>
<span style="color: #5c5c5c">''' No se realiza ninguna comprobación sobre la sentencia&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;param name="OrdenarPor"&gt;Sentencia ORDER BY, si la hay.&lt;/param&gt;</span>
<span style="color: #5c5c5c">''' &lt;returns&gt;True operación completada, False si se ha producido</span>
<span style="color: #5c5c5c">''' un error&lt;/returns&gt;</span>
<span style="color: #5c5c5c">''' &lt;remarks&gt;Hay que haber pasado previamente la cadena de</span>
<span style="color: #5c5c5c">''' conexión a la propiedad CadConexion y abrir la conexión</span>
<span style="color: #5c5c5c">''' con el método Conectar antes de llamar a este método</span>
<span style="color: #5c5c5c">''' y llamar a Desconectar al finalizar.&lt;/remarks&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Function</span> RellenarCombo(<span style="color: #0000ff">ByVal</span> MiControl <span style="color: #0000ff">As</span> _
        System.Windows.Forms.ListControl, _
        <span style="color: #0000ff">ByVal</span> Tabla <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> ClavePrincipal <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span> = 0, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> CampoDescriptor <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span> = 1, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> SentenciaWhere <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span> = "", _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> OrdenarPor <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span> = "") <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> deVuelta <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #008000">'Según el tipo de base de datos al que estemos conectados, </span>
    <span style="color: #008000">'llama a una u otra función que rellenarán el combo.</span>
    <span style="color: #0000ff">Try</span>
        <span style="color: #0000ff">Select</span> <span style="color: #0000ff">Case</span> _BDD
            <span style="color: #0000ff">Case</span> QueBase.Access
                deVuelta = <span style="color: #0000ff">Me</span>.RellenarComboOleDB(MiControl, _
                    Tabla, ClavePrincipal, CampoDescriptor, _
                    SentenciaWhere, OrdenarPor)
            <span style="color: #0000ff">Case</span> QueBase.SQL
                deVuelta = <span style="color: #0000ff">Me</span>.RellenarComboSQL(MiControl, _
                    Tabla, ClavePrincipal, CampoDescriptor, _
                    SentenciaWhere, OrdenarPor)
            <span style="color: #0000ff">Case</span> <span style="color: #0000ff">Else</span>
                deVuelta = <span style="color: #0000ff">False</span>
                <span style="color: #0000ff">Throw</span> <span style="color: #0000ff">New</span> ApplicationException( _
                    <span style="color: #b22222">"Tipo de base de datos desconocido o no establecido"</span>)
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">Select</span>
    <span style="color: #0000ff">Catch</span> NoConexion <span style="color: #0000ff">As</span> Exception
        <span style="color: #0000ff">Throw</span> NoConexion
        deVuelta = <span style="color: #0000ff">False</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Try</span>
    <span style="color: #0000ff">Return</span> deVuelta
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">La otra variante de RellenarCombo no necesita tener una conexión abierta, sino que se preocupa él mismo de abrirla y cerrarla. Para ello, tiene un parámetro adicional que es la cadena de conexión. Así, si sólo vamos a llenar un ListControl, podemos usar este método y condensarlo todo en una única llamada, mientras que usaremos el anterior si vamos a aprovechar la conexión abierta para más cosas (llenar varios combos y listboxes, llenar algún dataset&#8230;). </span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Function</span> RellenarCombo(<span style="color: #0000ff">ByVal</span> MiControl <span style="color: #0000ff">As</span> _
        System.Windows.Forms.ListControl, _
        <span style="color: #0000ff">ByVal</span> Tabla <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, _
        <span style="color: #0000ff">ByVal</span> CadenaConexion <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> ClavePrincipal <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span> = 0, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> CampoDescriptor <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span> = 1, _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> SentenciaWhere <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span> = "", _
        <span style="color: #0000ff">Optional</span> <span style="color: #0000ff">ByVal</span> OrdenarPor <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span> = "") <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> DeVuelta <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
<span style="color: #0000ff">    Try</span>
        <span style="color: #0000ff">Me</span>.CadConexion = CadenaConexion
        DeVuelta = <span style="color: #0000ff">Me</span>.Conectar
        <span style="color: #0000ff">If</span> DeVuelta <span style="color: #0000ff">Then</span>
            DeVuelta = <span style="color: #0000ff">Me</span>.RellenarCombo(MiControl, _
                Tabla, ClavePrincipal, CampoDescriptor, _
                SentenciaWhere, OrdenarPor)
    <span style="color: #0000ff">    End</span> <span style="color: #0000ff">If</span>
<span style="color: #0000ff">    Catch</span> NoConexion <span style="color: #0000ff">As</span> Exception
        DeVuelta = <span style="color: #0000ff">False</span>
        <span style="color: #0000ff">Throw</span> NoConexion
<span style="color: #0000ff">    Finally</span>
        <span style="color: #0000ff">Me</span>.Desconectar()
<span style="color: #0000ff">    End</span> <span style="color: #0000ff">Try</span>
<span style="color: #0000ff">    Return</span> DeVuelta
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Y eso es todo. No es ninguna maravilla, pero me es útil. Si a alguien le sirve, pues mejor. </span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">*Ejem* Bueno, no es todo. RellenarCombo presenta 4 sobrecargas (variantes) y aquí sólo he puesto dos de ellas. Las otras dos son iguales, pero cambiando el <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">ListControl</span> por un <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">DataGridViewComboBoxColumn</span>, o sea, la variante del ComboBox para DataGridView. Cambiando ese pequeño detalle, son exactamente iguales y, por supuesto, llevan sus métodos privados correspondientes (<span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">RellenarComboDataGridOleDB</span> y <span style="font-family: 'Courier New',Courier,monospace; font-size: 10pt">RellenarComboDataGridSQL</span>, de momento). Y, ahora, sí, eso es to&#8230; to&#8230; todo, amigos.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2008/02/19/llenar-un-combobox-iv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Llenar un ComboBox III</title>
		<link>http://cda-ie.es/2008/02/15/llenar-un-combobox-iii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=llenar-un-combobox-iii</link>
		<comments>http://cda-ie.es/2008/02/15/llenar-un-combobox-iii/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 18:38:02 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2008/02/15/llenar-un-combobox-iii/</guid>
		<description><![CDATA[Seguimos, que es viernes y no tengo ganas de hacer mucho en el curro. Continuando con el aprendizaje, esta clase no sólo fue mi primera clase y supuso mi primer constructor, sino que también fue la primera vez que me pegué con las propiedades. Prácticamente se puede decir que LlenarComboBox me desvirgó en VB2005. La [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Seguimos, que es viernes y no tengo ganas de hacer mucho en el curro.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Continuando con el aprendizaje, esta clase no sólo fue mi primera clase y supuso mi primer constructor, sino que también fue la primera vez que me pegué con las propiedades. Prácticamente se puede decir que LlenarComboBox me desvirgó en VB2005. La clase terminó con tres propiedades públicas: la cadena de conexión, el objeto conexión OleDB y el objeto conexión SQL. Inicialemente estos dos últimos eran uno solo (sólo OleDB) y de sólo lectura, pero luego empecé a cogerle cariño a los bloque Using y modifiqué el código. Y no hay mucho más que decir, las propiedades son éstas:</span></p>
<p><span id="more-24"></span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Cadena de conexión que va a usarse luego para conectarse</span>
<span style="color: #5c5c5c">''' a la base de datos</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">WriteOnly</span> <span style="color: #0000ff">Property</span> CadConexion() <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>
    <span style="color: #0000ff">Set</span>(<span style="color: #0000ff">ByVal</span> value <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>)
        <span style="color: #0000ff">Me</span>._Conexion = value
        <span style="color: #008000">'Identificamos el tipo de conexión.</span>
        <span style="color: #0000ff">Me</span>._BDD = QueBase.NoSel
        <span style="color: #0000ff">For</span> i <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span> = 0 <span style="color: #0000ff">To</span> <span style="color: #0000ff">Me</span>._TipoConexion.Length - 1
            <span style="color: #0000ff">If</span> <span style="color: #0000ff">Me</span>._Conexion.IndexOf(<span style="color: #0000ff">Me</span>._TipoConexion(i).Presenta) _
                                     &lt;&gt; -1 <span style="color: #0000ff">Then</span>
                <span style="color: #0000ff">Me</span>._BDD = <span style="color: #0000ff">Me</span>._TipoConexion(i).Tipo
                <span style="color: #0000ff">Exit</span> <span style="color: #0000ff">For</span>
            <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
        <span style="color: #0000ff">Next</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Set</span>
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Property</span>

<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Establece o devuelve el objeto OLEDBConnection</span>
<span style="color: #5c5c5c">'''  que usa LlenarCombobox</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Property</span> ConexionOLEDB() <span style="color: #0000ff">As</span> OleDb.OleDbConnection
    <span style="color: #0000ff">Get</span>
        <span style="color: #0000ff">Return</span> <span style="color: #0000ff">Me</span>._cnOleDb
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Get</span>
    <span style="color: #0000ff">Set</span>(<span style="color: #0000ff">ByVal</span> value <span style="color: #0000ff">As</span> OleDb.OleDbConnection)
        <span style="color: #0000ff">If</span> value <span style="color: #0000ff">IsNot</span> <span style="color: #0000ff">Nothing</span> <span style="color: #0000ff">Then</span>
            <span style="color: #0000ff">Me</span>._cnOleDb = value
            <span style="color: #0000ff">Me</span>.CadConexion = value.ConnectionString
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Set</span>
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Property</span>

<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Establece o devuelve el objeto SQLConnection</span>
<span style="color: #5c5c5c">''' que usa LlenarCombobox</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Property</span> ConexionSQL() <span style="color: #0000ff">As</span> SqlClient.SqlConnection
    <span style="color: #0000ff">Get</span>
        <span style="color: #0000ff">Return</span> <span style="color: #0000ff">Me</span>._cnSQL
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Get</span>
    <span style="color: #0000ff">Set</span>(<span style="color: #0000ff">ByVal</span> value <span style="color: #0000ff">As</span> SqlClient.SqlConnection)
        <span style="color: #0000ff">If</span> value <span style="color: #0000ff">IsNot</span> <span style="color: #0000ff">Nothing</span> <span style="color: #0000ff">Then</span>
            <span style="color: #0000ff">Me</span>._cnSQL = value
            <span style="color: #0000ff">Me</span>.CadConexion = value.ConnectionString
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Set</span>
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Property</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Sigo con la duda de si añadir en el Set una comprobación del tipo</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">If</span> <span style="color: #0000ff">Me</span>._cnOleDb <span style="color: #0000ff">Is</span> <span style="color: #0000ff">Nothing</span> <span style="color: #0000ff">Then</span>
    <span style="color: #0000ff">Me</span>._cnOleDb = <span style="color: #0000ff">New</span> OleDb.OleDbConnection
<span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">que es lo que me pide el cuerpo, pero sin esas tres líneas también funciona, aunque no sé el porqué. En fin, todavía no soy más que un aficionadillo.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Los métodos de conexión  están divididos en dos grupos: los métodos públicos y los métodos privados. El método público Conectar  identifica el tipo de conexión que estamos manejando y llama al método privado correspondiente. Vale, para las pocas líneas de código que son podría haber usado un único método, pero así me resulta más cómodo. Todos los métodos son funciones y devuelven un valor booleano con el resultado de la operación. Esto también es una manía personal, y bastante estúpida porque luego rara vez uso el valor de vuelta. De todas formas, ha habido veces (dos) que me ha venido bien. Por otra parte, en caso de error el método devuelve una excepción al método de llamada. En esta clase todos los errores se mandan de vuelta, para que se gestione desde el programa principal. No me complico mucho la vida, no.</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Conecta a la base de datos indicada</span>
<span style="color: #5c5c5c">''' por la cadena de conexión pasada previamente</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #5c5c5c">''' &lt;returns&gt;True si la conexión se realiza,</span>
<span style="color: #5c5c5c">''' false si se produce un error&lt;/returns&gt;</span>
<span style="color: #5c5c5c">''' &lt;remarks&gt;Hay que haber pasado la cadena de conexión previamente</span>
<span style="color: #5c5c5c">''' a la propiedad CadConexion, de lo contrario devuelve false.</span>
<span style="color: #5c5c5c">''' Si se produce una excepción, la devuelve para su gestión&lt;/remarks&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Function</span> Conectar() <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> Result <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Try</span>
        <span style="color: #0000ff">Select</span> <span style="color: #0000ff">Case</span> _BDD
            <span style="color: #0000ff">Case</span> QueBase.NoSel
                <span style="color: #008000">'Mensaje de error</span>
            <span style="color: #0000ff">Case</span> QueBase.Access
                Result = <span style="color: #0000ff">Me</span>.ConectarOleDB
            <span style="color: #0000ff">Case</span> QueBase.SQL
                Result = <span style="color: #0000ff">Me</span>.ConectarSQL
            <span style="color: #0000ff">Case</span> <span style="color: #0000ff">Else</span>
                Result = <span style="color: #0000ff">False</span>
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">Select</span>
    <span style="color: #0000ff">Catch</span> NoConexion <span style="color: #0000ff">As</span> Exception
        <span style="color: #0000ff">Throw</span> NoConexion
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Try</span>
    <span style="color: #0000ff">Return</span> Result
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span>

<span style="color: #0000ff">Private</span> <span style="color: #0000ff">Function</span> ConectarOleDB() <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> Result <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">If</span> <span style="color: #0000ff">Me</span>._cnOleDb <span style="color: #0000ff">Is</span> <span style="color: #0000ff">Nothing</span> <span style="color: #0000ff">Then</span>
        <span style="color: #0000ff">Me</span>._cnOleDb = <span style="color: #0000ff">New</span> OleDb.OleDbConnection
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">With</span> <span style="color: #0000ff">Me</span>
        <span style="color: #0000ff">Try</span>
            ._cnOleDb.ConnectionString = ._Conexion
            ._cnOleDb.Open()
            Result = <span style="color: #0000ff">True</span>
        <span style="color: #0000ff">Catch</span> ex <span style="color: #0000ff">As</span> OleDb.OleDbException
            ._cnOleDb.Close()
            Result = <span style="color: #0000ff">False</span>
            <span style="color: #0000ff">Throw</span> ex
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">Try</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">With</span>
    <span style="color: #0000ff">Return</span> Result
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span>

<span style="color: #0000ff">Private</span> <span style="color: #0000ff">Function</span> ConectarSQL() <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">Dim</span> Result <span style="color: #0000ff">As</span> <span style="color: #0000ff">Boolean</span>
    <span style="color: #0000ff">If</span> <span style="color: #0000ff">Me</span>._cnSQL <span style="color: #0000ff">Is</span> <span style="color: #0000ff">Nothing</span> <span style="color: #0000ff">Then</span>
        <span style="color: #0000ff">Me</span>._cnSQL = <span style="color: #0000ff">New</span> SqlClient.SqlConnection
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">With</span> <span style="color: #0000ff">Me</span>
        <span style="color: #0000ff">Try</span>
            ._cnSQL.ConnectionString = ._Conexion
            ._cnSQL.Open()
            Result = <span style="color: #0000ff">True</span>
        <span style="color: #0000ff">Catch</span> ex <span style="color: #0000ff">As</span> SqlClient.SqlException
            ._cnSQL.Close()
            Result = <span style="color: #0000ff">False</span>
            <span style="color: #0000ff">Throw</span> ex
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">Try</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">With</span>
    <span style="color: #0000ff">Return</span> Result
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Function</span>

<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Sub</span> Desconectar()
    <span style="color: #0000ff">Select</span> <span style="color: #0000ff">Case</span> _BDD
        <span style="color: #0000ff">Case</span> QueBase.Access
            <span style="color: #0000ff">Me</span>._cnOleDb.Close()
            <span style="color: #0000ff">Me</span>._cnOleDb = <span style="color: #0000ff">Nothing</span>
        <span style="color: #0000ff">Case</span> QueBase.SQL
            <span style="color: #0000ff">Me</span>._cnSQL.Close()
            <span style="color: #0000ff">Me</span>._cnSQL = <span style="color: #0000ff">Nothing</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Select</span>
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Sub</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Como se puede ver, en el método público Conectar falta gestionar el caso de que se intente conectar sin haber definido primeramente el tipo de base de datos, o sea, cuando falta la cadena de conexión. Olvidadizo que es uno. Pero, vamos, que ahí se generará una nueva excepción (tipo aún por decidir) con un mensaje que informe de lo inútil que es el progrador que se olvidó de poner los pilares antes de levantar los tabiques y a otra cosa.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Y eso es todo por hoy. Como se puede ver, un poquito de código sencillito y es que mis neuronas no dan para mucho más. La próxima entrega, los métodos privados y públicos para llenar un ListControl (o sea, tanto un ListBox como un ComboBox). He de reconocer que con ellos puse en práctica por primera vez lo de la &#8220;sobrecarga de operadores&#8221; y, confieso, me emocioné un poco. Hasta entonces, nos vemos en el <em>Gentleman Loser</em></span></p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2008/02/15/llenar-un-combobox-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Llenar un ComboBox II</title>
		<link>http://cda-ie.es/2008/02/14/llenar-un-combobox-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=llenar-un-combobox-ii</link>
		<comments>http://cda-ie.es/2008/02/14/llenar-un-combobox-ii/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 21:33:53 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2008/02/14/llenar-un-combobox-ii/</guid>
		<description><![CDATA[Tengo aún pendiente la clase de LlenarCombo que comenté en una de las primeras entradas de este blog. La verdad es que he tenido Visual Basic muy abandonado. A ver si me pongo las pilas y termino la dichosa aplicación de Anime en VB2005 y hago la de gestión doméstica en VB2008 antes de que [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Tengo aún pendiente la clase de LlenarCombo que comenté en una de las primeras entradas de este blog. La verdad es que he tenido Visual Basic muy abandonado. A ver si me pongo las pilas y termino la dichosa aplicación de Anime en VB2005 y hago la de gestión doméstica en VB2008 antes de que me arruine.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Pero, primero, lo prometido es deuda: ejercicio de egocentrismo concentrado y autopropaganda. O sea, <em>my first class: </em>LlenarComboBox. La idea, pequeño recordatorio, era rellenar unos combos o listboxes con la clave primaria y un campo descriptor de su tabla correspondiente y luego enlazar el combo (o listbox) al dataset tipado con el que vamos a trabajar mediante un bindingsource. De este modo, en el método de carga de datos del formulario tendría algo como esto:</span></p>
<p><span id="more-23"></span></p>
<ul>
<li><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Abrir conexión con la BDD.</span></li>
<li><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Llenar los combos.</span></li>
<li><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Llenar el dataset tipado con su tableadapter correspondiente, aprovechando la conexión abierta antes.</span></li>
<li><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Cerrar la conexión.</span></li>
<li><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Ligar el dataset con el bindingsoure y el selectedvalue del combo con el campo correspondiente.</span></li>
</ul>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Vale, no es ninguna maravilla de idea y habrá a quien le produzca sarpullidos la idea de usar un dataset tipado, pero es de las primeras cosas que hice en VB2005, cuando intentaba comprender cómo funciona su acceso a datos, que cuando vienes de VB6 y ADO es un <em>infienno</em> y lo que deseas es tirar el dataset a la basura y usar un recordset.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Viendo lo que quería que hicera la clase, lo que necesitaba era un método <em>Conectar</em> que me abriera la conexión, un método <em>Desconectar</em> que la cerrara, una propiedad para pasarle la cadena de conexión y un método que llenara el combo pasándole como parámetros el combo y el nombre de la tabla que contenía los datos. Simple y sencillo.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Luego me emocioné y ya no fue tan simple y sencillo, pero bueno&#8230; Por ejemplo, originalmente la única conexión que hacía era a una base de datos Access, pero la primavera pasada me hizo falta en el trabajo que se conectara a una base de datos SQL Server, así que modifiqué toda la clase para permitir conexiones tanto a través de OleDB como de SQL y, a la vez, dejar abierta la posibilidad de nuevas conexiones. Para distinguir las conexiones no me compliqué mucho la vida: he definido una estructura que tiene dos campos, el identificador de la base de datos (uso una enumeración porque soy muy perro) y una string con un texto identificativo de la cadena de conexión del tipo de conexión dado. En el constructor de la clase relleno un array de esta estructura con los casos posibles. La idea es bastante tonta: cuando le pase la cadena de conexión a la clase, miro. Si presente &#8220;Jet.OLEDB&#8221; es que voy a conectarme a una base de datos ACCESS, y así.</span></p>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">El resto de las variables privadas, como puede verse, son los objetos conexión necesarios, una string que contendrá la cadena de conexión y una variable del tipo enumeración antes definida que indicará el tipo de base de datos que corresponde a la cadena de conexión almacenada. En resumen, el código siguiente:</span></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre style="font-family: 'Courier New',Courier,monospace; font-size: 9pt">
<span style="color: #0000ff">Imports</span> System.Data
<span style="color: #0000ff">Imports</span> System.Windows.Forms
<span style="color: #0000ff">Imports</span> System.Xml

<span style="color: #0000ff">Public Class</span> LlenarComboBox

#<span style="color: #0000ff">Region</span> <span style="color: #b22222">" Declaraciones "</span>

    <span style="color: #008000">'Declaración de enumeraciones y estructuras previas</span>
    <span style="color: #0000ff">Private Enum</span> QueBase <span style="color: #0000ff">As</span> <span style="color: #0000ff">Integer</span>
        NoSel = -1
        Access
        SQL
    <span style="color: #0000ff">End Enum</span>
    <span style="color: #0000ff">Private Structure</span> TipoBDD
        <span style="color: #0000ff">Public</span> Tipo <span style="color: #0000ff">As</span> QueBase
        <span style="color: #0000ff">Public</span> Presenta <span style="color: #0000ff">As String</span> <span style="color: #008000">'texto reconocible de la cadena </span>
        <span style="color: #008000">'de conexión que nos permita identificar el tipo de BDD</span>
    <span style="color: #0000ff">End Structure</span>
    <span style="color: #008000">'Declaración de variables</span>
    <span style="color: #0000ff">Private</span> _cnOleDb <span style="color: #0000ff">As</span> OleDb.OleDbConnection
    <span style="color: #0000ff">Private</span> _cnSQL <span style="color: #0000ff">As</span> SqlClient.SqlConnection
    <span style="color: #0000ff">Private</span> _Conexion <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span> <span style="color: #008000">'La cadena de conexión</span>
    <span style="color: #0000ff">Private</span> _BDD <span style="color: #0000ff">As</span> QueBase = QueBase.NoSel
    <span style="color: #0000ff">Private</span> _TipoConexion() <span style="color: #0000ff">As</span> TipoBDD
#<span style="color: #0000ff">End</span> <span style="color: #0000ff">Region</span>
<span style="color: #008000">'Relleno del array Tipo de Conexion al
'inicializar una instancia de la clase</span>
    <span style="color: #0000ff">Public</span> <span style="color: #0000ff">Sub New</span>()
        <span style="color: #0000ff">ReDim</span> _TipoConexion(2)
        _TipoConexion(0).Tipo = QueBase.Access
        _TipoConexion(0).Presenta = <span style="color: #b22222">"Jet.OLEDB"</span>
        _TipoConexion(1).Tipo = QueBase.SQL
        _TipoConexion(1).Presenta = <span style="color: #b22222">"Initial Catalog"</span> <span style="color: #008000">'Server puro</span>
        _TipoConexion(2).Tipo = QueBase.SQL
        _TipoConexion(2).Presenta = <span style="color: #b22222">"AttachDbFilename"</span> <span style="color: #008000">'Archivo bdd</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">Sub</span></pre>
</td>
</tr>
</table>
<p align="justify"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 10pt">Y por hoy me temo que lo dejo, que es tarde. Mañana, las propiedades públicas y los métodos de conexión y desconexión. Hasta entonces, nos vemos en el <em>Gentleman Loser</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2008/02/14/llenar-un-combobox-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Llenar un ComboBox</title>
		<link>http://cda-ie.es/2008/01/09/llenar-un-combobox/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=llenar-un-combobox</link>
		<comments>http://cda-ie.es/2008/01/09/llenar-un-combobox/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 16:13:01 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2008/01/09/llenar-un-combobox/</guid>
		<description><![CDATA[El problema es el siguiente: tengo una tabla con un número de registros reducido (diez o doce como mucho). Quiero poder elegir el registro en un listbox o un combobox. Simple, ¿no? La ventaja del ListControl, tanto ListBox como ComboBox, es que para cada entrada en el mismo puedo tener dos valores, el mostrado (DisplayMember) [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><font face="Arial, Helvetica, sans-serif">El problema es el siguiente: tengo una tabla con un número de registros reducido (diez o doce como mucho). Quiero poder elegir el registro en un listbox o un combobox. Simple, ¿no? La ventaja del ListControl, tanto ListBox como ComboBox, es que para cada entrada en el mismo puedo tener dos valores, el mostrado (DisplayMember) y el ValueMember. Así, en el ValueMember puedo tener la clave primaria de la tabla, que es internamente con lo que trabajaré, mientras que muestro el campo descriptor que me interese al usuario. No estoy contando nada nuevo.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Una posibilidad sería usar una combinación de DataSet y  BindingSource, estableciendo como DataSource del ListControl el BindingSource y seleccionando los campos a mostrar como DisplayMember y ValueMember. Este método lo he usado bastante, la verdad, pero como herramienta de navagación entre registros en la tabla principal que se muestra en el formulario. Me explico: </font></p>
<p><img src="http://i114.photobucket.com/albums/n280/ercubano/ListBox.png" width="422" height="222"/><br />
<span id="more-10"></span></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">En rojo aparece señalado un ListBox usado como herramienta de navegación por registros. Lo que busco realmente es el señalado en azul, que presenta una lista de estudios que han producido esas series. El combo muestra el campo Nombre de la tabla Estudio pero también almacena la clave principal, IdEstudio, que es clave externa en la tabla de Series. Lo mismo es aplicable para el combo Valoración (justo encima) y otros. Otro ejemplo quizás más práctico sería un combo con el listado de comerciales en la pantalla de generar nuevo pedido de una aplicación de gestión. Es importante saber qué comercial ha hecho el pedido (sobre todo si van a comisión) y, si son pocos, nos ahorramos el tener que diseñar un formulario de búsqueda o que el comercial tenga que aprenderse su código.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Pero me estoy desviando. Quiero mostrar una tabla (la clave primaria y un campo descriptor) en un ListControl. No voy a trabajar con esa tabla directamente (altas, bajas, modificaciones), así que no necesito tener un dataset zumbando por ahí, así que voy a usar un datareader. La &quot;cosa&quot; quedaría más o menos así:</font></p>
<table align="center" width="90%" bgcolor="#E6E6FA">
<tr>
<td>
<pre><font face="Courier New, Courier, monospace"><span style="color: #0000FF">Dim</span> drDatos <span style="color: #0000FF">As</span> OleDb.OleDbDataReader
<span style="color: #0000FF">Dim</span> cnOleDb <span style="color: #0000FF">As</span> <span style="color: #0000FF">New</span> OleDb.OleDbConnection(MiConexion)
<span style="color: #0000FF">Dim</span> Comando <span style="color: #0000FF">As</span> <span style="color: #0000FF">New</span> OleDb.OleDbCommand(<span style="color: #B22222">"SELECT * FROM "</span> &#038; Tabla, cnOleDb)
<span style="color: #0000FF">Dim</span> tbTabla <span style="color: #0000FF">As</span> <span style="color: #0000FF">New</span> DataTable
cnOleDb.Open()
drDatos = Comando.ExecuteReader()
tbTabla.Load(drDatos, LoadOption.OverwriteChanges)
MiControl.DataSource = tbTabla
MiControl.DisplayMember = tbTabla.Columns.Item(1).Caption
MiControl.ValueMember = tbTabla.Columns.Item(0).Caption
drDatos.Close()
cnOleDb.Close()</font></pre>
</td>
</tr>
</table>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Donde <font face="Courier New, Courier, monospace">Tabla</font> es el nombre de la tabla en cuestión, <font face="Courier New, Courier, monospace">MiConexion</font> es la cadena de conexión empleada y se asume que el campo 0 de la tabla es la clave primaria (ValueMember) y el campo 1 es el campo descriptor que vamos a mostrar y <font face="Courier New, Courier, monospace">MiControl</font> es el ListControl (da igual que sea un ListBox o un ComboBox) que vamos a rellenar. El código del ejemplo es un poco &quot;de andar por casa&quot;. Lo suyo sería que el objeto conexión estuviera en un bloque <font face="Courier New, Courier, monospace">Using</font> y falta la gestión de errores, pero sirve como base.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Como este procedimiento, es decir, llenar un ComboBox o ListBox con datos de una tabla a partir de un DataReader, lo utilizo bastante, me sirvió para hacerme mi primera clase en Visual Basic 2005 (y comprender cómo funcionan), así como para probar el tema de las sobrecargas. Es mi idea comentar esa primera clase en próximas entradas, por puro y sencillo egocentrismo (tampoco es que me vaya a leer nadie, claro).</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Nos vemos en el Forlon.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2008/01/09/llenar-un-combobox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ups, ¿y la contraseña del superusuario?</title>
		<link>http://cda-ie.es/2008/01/04/ups-%c2%bfy-la-contrasena-del-superusuario/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ups-%25c2%25bfy-la-contrasena-del-superusuario</link>
		<comments>http://cda-ie.es/2008/01/04/ups-%c2%bfy-la-contrasena-del-superusuario/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 18:13:07 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2008/01/04/ups-%c2%bfy-la-contrasena-del-superusuario/</guid>
		<description><![CDATA[Ayer me encontré con un pequeño y pintoresco problema: después de instalar la actualización para el nuevo plan contable en la aplicación de gestión y contabilidad que usamos en la fábrica me encontré con que no me aceptaba la contraseña del superusuario (en este caso, llamado Supervisor). Jaja, diréis algunos, se le olvidó. Pues no, [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><font face="Arial, Helvetica, sans-serif">Ayer me encontré con un pequeño y pintoresco problema: después de instalar la actualización para el nuevo plan contable en la aplicación de gestión y contabilidad que usamos en la fábrica me encontré con que no me aceptaba la contraseña del superusuario (en este caso, llamado Supervisor). Jaja, diréis algunos, se le olvidó. Pues no, yo juro y perjuro que mi burro nació sin rabo, digo, que con la contraseña que yo intentaba meterle sin éxito estuvimos trabajando el viernes anterior, cuando hicimos el primer intento de abrir el nuevo ejercicio 2008.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">En todo caso, el asunto era simple: no podía entrar como Supervisor y el Supervisor es el único usuario que puede hacer ciertas tareas de mantenimiento, como, por ejemplo, no sé, ¿quitar una contraseña olvidada? Para solucionar este pequeño contratiempo necesitaba pensar rápido y conocer a fondo las herramientas internas del programa (que las tiene muy buenas). En la parte primera, el contratiempo se produjo poco antes del fin de la jornada matutina, así que tuve dos horitas para pensar tranquilamente la solución. Realmente, tampoco es que el problema fuera tan complicado, pero todo pasaba por saber dónde guardaba el programa la contraseña de los usuarios y cómo eliminarla (o leerla, si estaba en claro). Por lo pronto, esta información debe ser común a todo el programa. Un rápido vistazo al árbol de directorios del programa me llevó a la carpeta &#8220;comunes&#8221; y ahí encontrar el archivo &#8220;usuarios&#8221;. Concretamente, tres archivos, con extensión .cdx, .dbf y .fpt. Ya tenía la tabla <font face="Courier New, Courier, monospace">usuarios</font> localizada, sólo quedaba abrirla.</font></p>
<p><span id="more-8"></span></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Ups, mira que llevo tiempo diciéndome que debo aprender a usar las herramientas de gestión de base de datos que incluye la aplicación. Las he visto usar cuando nos han dado asistencia remota con un problema recurrente que tenemos y son muy completas. El caso es que no sé cómo funcionan y tampoco tenía tiempo en ese momento de ponerme a averiguarlo. Necesitaba abrir esa base de datos de Visual FoxPro con una herramienta conocida por mí, y ya está, así que recurrí a Visual Basic 2005, con idea de generar una aplicación simple con un dataset tipado, rezando para que Visual Estudio fuera capaz de abrir una base de Visual FoxPro como origen de datos. </font></p>
<p><img src="http://i114.photobucket.com/albums/n280/ercubano/ODBC.png" alt="Origen de datos ODBC" longdesc="Accediendo a una base de datos ODBC" align="left" height="337" hspace="5" width="300" /></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Dicho y hecho: elegí como origen de datos <font face="Courier New, Courier, monospace">OBDC</font> y en Especificación del origen de datos marqué <font face="Courier New, Courier, monospace">Usar cadena de conexión</font> y pulsé en <font face="Courier New, Courier, monospace">Generar</font>. Buceando por la pestaña Origen de datos de equipo encontré directamente el origen de datos <font face="Courier New, Courier, monospace">COMUN001</font> que quería. Así da gusto. En la cadena de conexión, de todos modos, cambié la ruta por una copia de la base de datos que me llevé al disco duro local. El resto de los pasos para generar el dataset tipado fueron los normales. Efectivamente, en la base de datos comunes había una tabla usuarios con un campo llamado clave. Metí en el formulario una rejilla vinculada al dataset por el procedimiento del tirón (o sea, arrastra y suelta) y listo.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Bueno, casi. Al ejecutar la miniaplicación efectivamente accedí a la tabla de usuarios y vi las claves, pero se presentaron dos problemas. El primero es que las claves no estaban en claro. Éste fue el de menos, ya que uno de los usuarios tiene la clave en blanco, así que tenía que coger los caracteres de la clave de este usuario y ponérselos al superusuario para tener la clave de éste en blanco. Aquí llegó el segundo problema: Visual Basic no fue capaz de generar la sentencia UPDATE al crear el dataset tipado.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Pues nada, que tocó escribir código. 3 minutos más de trabajo, total de 15 (incluyendo el repaso rápido del UPDATE, que siempre se me olvida cómo va). Agregué un botón al formulario con lo siguiente:</font></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre><font face="Courier New, Courier, mono"><span style="color: #0000ff">Private</span> <span style="color: #0000ff">Sub</span> Button1_Click(<span style="color: #0000ff">ByVal</span> sender <span style="color: #0000ff">As</span> System.<span style="color: #0000ff">Object</span>, _
            <span style="color: #0000ff">ByVal</span> e <span style="color: #0000ff">As</span> System.EventArgs) <span style="color: #0000ff">Handles</span> Button1.Click
    <span style="color: #0000ff">Dim</span> ocConexion <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> Odbc.OdbcConnection( _
                <span style="color: #0000ff">My</span>.Settings.ConnectionString)
    <span style="color: #0000ff">Dim</span> coComando <span style="color: #0000ff">As</span> <span style="color: #0000ff">New</span> Odbc.OdbcCommand
    <span style="color: #0000ff">Dim</span> Usuario <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>
    <span style="color: #0000ff">Dim</span> Clave <span style="color: #0000ff">As</span> <span style="color: #0000ff">String</span>
    <span style="color: #0000ff">Dim</span> msg <span style="color: #0000ff">As</span> Microsoft.VisualBasic.MsgBoxResult
    msg = MsgBox(<span style="color: #0000ff">My</span>.Settings.ConnectionString, MsgBoxStyle.OkCancel)
    <span style="color: #0000ff">If</span> msg = MsgBoxResult.Cancel <span style="color: #0000ff">Then</span> <span style="color: #0000ff">Exit</span> <span style="color: #0000ff">Sub</span>
    Usuario = InputBox(<span style="color: #b22222">"Usuario"</span>)
    Clave = InputBox(<span style="color: #b22222">"clave"</span>)
    coComando.CommandText = <span style="color: #b22222">"UPDATE usuarios SET clave='"</span> _
            &amp; Clave &amp; <span style="color: #b22222">"' WHERE nombre='"</span> &amp; Usuario &amp; <span style="color: #b22222">"'"</span>
    ocConexion.Open()
    coComando.Connection = ocConexion
    coComando.ExecuteNonQuery()
    ocConexion.Close()
    MsgBox(<span style="color: #b22222">"Ok"</span>)
<span style="color: #0000ff">End</span> <span style="color: #0000ff">Sub</span></font></pre>
</td>
</tr>
</table>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Por último, cogí la tabla de usuarios así modificada (los tres archivos), se la encasqueté a la base de datos buena del servidor, inicié la aplicación y listo, todo funcionando bien otra vez (durante media tarde, hasta que dio el siguiente error en la actualización, un error al acceder a una tabla en la que se había introducido un valor basura al ejecutar la primera parte de la actualización). Moraleja: no hay nada como un poco de pensamiento lateral y, sobre todo, si no tienes o no sabes manejar la herramienta adecuada, ten una que pueda hacer el trabajo y que sí sepas manejar.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Saludos desde el Forlon. Sed buenos y que os traigan muchas cosas los Reyes (por ejemplo, una canuta nuclear táctica). Yo quiero una furgoneta nueva, a ver si me dura más que las otras.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2008/01/04/ups-%c2%bfy-la-contrasena-del-superusuario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar una imagen en graaaande</title>
		<link>http://cda-ie.es/2007/12/21/mostrar-una-imagen-en-graaaande/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mostrar-una-imagen-en-graaaande</link>
		<comments>http://cda-ie.es/2007/12/21/mostrar-una-imagen-en-graaaande/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 17:06:54 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2005]]></category>

		<guid isPermaLink="false">http://cda-ie.es/2007/12/21/mostrar-una-imagen-en-graaaande/</guid>
		<description><![CDATA[Se supone que la primera entrada de un blog debería ser una presentación, pero ni las presentaciones ni las despedidas se me dan bien, así que prefiero empezar con algo que me gusta: Visual Basic 2005 y con la solución a un pequeño problema que se me planteó: Tengo un pequeño picturebox en un formulario [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><font face="Arial, Helvetica, sans-serif">Se supone que la primera entrada de un blog debería ser una presentación, pero ni las presentaciones ni las despedidas se me dan bien, así que prefiero empezar con algo que me gusta: Visual Basic 2005 y con la solución a un pequeño problema que se me planteó:</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Tengo un pequeño picturebox en un formulario donde se muestra la imagen asociada al registro en el que estemos (me da igual si hablamos de series, actores, muebles o coches).<br />
Hay algunas imágenes que son bastante grandes y muy bonitas y verlas en un picturebox de 100&#215;63 es una pena,así que decidí añadir un formulario con un picturebox que me mostrara la imagen a tamañocompleto. Básicamente, cogí un formulario (<strong>frmMostrarImagen</strong>) y le quite el texto del título y los bordes (<strong>FormBorderStyle=None</strong>). Le añadí un picturebox que debía ocupar todo el formulario (<strong>Dock=Fill</strong>). Este picturebox (picImagen) debe ajustarse al tamaño de la imagen (<strong>AutoSize=True</strong>). De igual modo, el formulario debe ajustarse al tamaño del picturebox, asíque su AutoSize también está en True y <strong>AutoSizeMode</strong> debe estar en <strong>GrowAndShrink</strong>.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Con esto ya sólo quedó añadir elcódigo necesario para que, pasándole la imagen a mostrar, la ponga en el picturebox y muestre el formulario.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Peeeeero&#8230; No queda bien. Si se le pasa una imagen con mayor resolución que la pantalla, sólo se ve una parte de la imagen. Mal íbamos. Por fortuna en My.Computer encontramos Screen y, dentro de Screen, WorkingArea. Sabiendo las dimensiones del área de trabajo de la pantalla estrivial comprobar si la imagen es más alta o ancha que el área de trabajo. En este caso pasaremos del AutoSize y ajustaremos el tamaño del picturebox al máximo que nos permita la resolución de pantalla, manteniendolas proporciones de la imagen.</font></p>
<p><font face="Arial, Helvetica, sans-serif">En resumen, esto:</font></p>
<table align="center" bgcolor="#e6e6fa" width="90%">
<tr>
<td>
<pre>
 <font face="Arial">
<span style="color: #5c5c5c">''' &lt;summary&gt;</span>
<span style="color: #5c5c5c">''' Carga la imagen a mostrar y muestra el formulario de modo modal</span>
<span style="color: #5c5c5c">''' &lt;/summary&gt;</span>
<span style="color: #0000ff">Public</span> <span style="color: #0000ff">Sub</span> MostrarImagen(<span style="color: #0000ff">ByRef</span> queImagen <span style="color: #0000ff">As</span> Image)
    <span style="color: #008000">'Comprobamos si el tamaño de la imagen (alto o ancho) es mayor</span>
    <span style="color: #008000">'al área de trabajo de la pantalla. Si es así, ajustamos la imagen</span>
    <span style="color: #008000">'al área de trabajo manteniendo las proporciones.</span>
    <span style="color: #0000ff">If</span> queImagen.Height &gt; <span style="color: #0000ff">My</span>.Computer.Screen.WorkingArea.Height _
    	<span style="color: #0000ff">OrElse</span> queImagen.Width &gt; <span style="color: #0000ff">My</span>.Computer.Screen.WorkingArea.Width <span style="color: #0000ff">Then</span>
        <span style="color: #008000">'Lo primero es poner el autosize del formulario a false</span>
        <span style="color: #008000">'Si no lo hacemos y quitamos el autosize del picbox, no se muestra nada</span>
        <span style="color: #008000">'(el formulario queda con tamaño 0)</span>
        <span style="color: #0000ff">Me</span>.AutoSize = <span style="color: #0000ff">False</span>
        <span style="color: #0000ff">Me</span>.picImagen.SizeMode = PictureBoxSizeMode.Zoom
        <span style="color: #008000">'Vemos que dimensión (ancho, alto) es mayor, pues será sobre la que ajustemos</span>
        <span style="color: #0000ff">If</span> queImagen.Size.Width &gt; queImagen.Size.Height <span style="color: #0000ff">Then</span>
        	<span style="color: #0000ff">Me</span>.Width = <span style="color: #0000ff">My</span>.Computer.Screen.WorkingArea.Width
            <span style="color: #0000ff">Me</span>.Height = <span style="color: #0000ff">Me</span>.Width * queImagen.Height / queImagen.Width
        <span style="color: #0000ff">Else</span>
            <span style="color: #0000ff">Me</span>.Height = <span style="color: #0000ff">My</span>.Computer.Screen.WorkingArea.Height
            <span style="color: #0000ff">Me</span>.Width = <span style="color: #0000ff">Me</span>.Height * queImagen.Width / queImagen.Height
        <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">End</span> <span style="color: #0000ff">If</span>
    <span style="color: #0000ff">Me</span>.picImagen.Image = queImagen
    <span style="color: #0000ff">Me</span>.ShowDialog()
 <span style="color: #0000ff">End</span> <span style="color: #0000ff">Sub</span></font></pre>
</td>
</tr>
</table>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Sólo queda hacer que el formulario se cierre (no hay barra de título, no hay como cerrarlo en principio). Cada cual tendrá sus formas, yo lo hice al hacer click sobre el picturebox y al pulsar cualquier tecla. Esto último en el evento KeyPress del formulario, previo hacer que el formulario capture las pulsaciones de las teclas antes que el picturebox (<strong>KeyPreview=True</strong>). De paso añadí un tooltip que mostrase un mensajito del tipo &#8220;Pulse la tecla <em>any</em> para cerrar esta ventana&#8221; y listo.</font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif">Fin de la primera entrada, nos vemos en el Forlon. </font></p>
<p align="justify"><font face="Arial, Helvetica, sans-serif"><strong>Actualización 08 de enero de 2008:</strong> he corregido la línea </font><font face="Courier New, Courier, monospace"><span style="color: #0000ff">Me</span>.Height = <span style="color: #0000ff">Me</span>.Width * queImagen.Height / queImagen.Width</font><font face="Arial, Helvetica, sans-serif"> y su equivalente con Width ya que no aparecía el símbolo de la división entera (la otra barra inclinada). Lo he sustituido por la barra de división normal, peeeeeero tiene que ser una división entera, o bien convertir el resultado en un entero. </font></p>
]]></content:encoded>
			<wfw:commentRss>http://cda-ie.es/2007/12/21/mostrar-una-imagen-en-graaaande/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

