Este código es una mejora del que escribí aquí. Pero esta vez, también puntua los miles.
private string FormatearNumero(decimal cifra )
{
string strCifra = Convert.ToString(cifra);
int dondeestalacoma = strCifra.IndexOf(',');
string partedecimal="";
string parteentera="";
if (dondeestalacoma != -1)
{
if (strCifra.Length > (dondeestalacoma + 2))
{
partedecimal = strCifra.Substring(dondeestalacoma + 1, 2);
parteentera = strCifra.Substring(0, dondeestalacoma);
}
}
else
{
parteentera = Convert.ToString(cifra);
partedecimal = ",00";
}
/*colocación de los puntos de miles*/
/*1º Creo un arraylist. En él se introcunen los numeros y los puntos de separación. Empiezo la extración desde el último dígito de la variable parte entera.
2º En la var. nuevonumero voy metiendo los trozos que en el paso 1 metí en el arraylist
3 Colocación de los primeros numeros de la cifra parteentera*/
ArrayList diferentespartesnumero = new ArrayList();
int numerodepuntos = 0;
if (parteentera.Length > 3)
{
for (int i = parteentera.Length; i > 3; i -= 3)
{
string trozo = parteentera.Substring(i - 3, 3);
diferentespartesnumero.Add(trozo);
diferentespartesnumero.Add(".");
numerodepuntos++;
}
string nuevonumero = "";
for (int j = diferentespartesnumero.Count - 1; j >= 0; j--)
nuevonumero += diferentespartesnumero[j].ToString();
int resto = (parteentera.Length + numerodepuntos) - nuevonumero.Length;
if (resto > 0 & resto <= 3)
{
string aux2 = parteentera.Substring(0, resto);
parteentera = aux2 + nuevonumero;
}
else
parteentera = nuevonumero.Substring(1, nuevonumero.Length - 1);
/**/
}
return strCifra = parteentera + "," + partedecimal;
}
Mostrando entradas con la etiqueta C #. Mostrar todas las entradas
Mostrando entradas con la etiqueta C #. Mostrar todas las entradas
10 mayo 2012
04 mayo 2012
C#: Función que devuelve la primera letra de un string en mayuscula
Sencillo y eficaz código que devuelve un string con el primer caracter en mayuscula. Así por ejemplo, metiendo como parámetro el string víctor está loco, nos devolverá Víctor está loco.
private string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}
Saludos.
private string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}
Saludos.
09 abril 2012
C#: Función que acorta una cifra decimal para sólo mostrar dos números
Hola. He creado esta función (cuyo nombre es pelín desastroso, y de hecho solicito que me sugerais ideas), porque me pidieron que debia acortar el precio mostrado en el report factura para sólo imprimir dos decimales.
Habra otros modos de hacerlo, pero a mi este me resulta muy útil.
private string AcortarCifra(decimal cifra)
{
string strCifra = Convert.ToString(cifra);
int dondeestalacoma = strCifra.IndexOf(',');
string partedecimal;
string parteentera;
if (dondeestalacoma != -1)
{
if (strCifra.Length > (dondeestalacoma + 2))
{
partedecimal = strCifra.Substring(dondeestalacoma + 1, 2);
parteentera = strCifra.Substring(0, dondeestalacoma);
strCifra = parteentera + "," + partedecimal;
}
}
else
strCifra = strCifra + ",00";
return strCifra;
}
Habra otros modos de hacerlo, pero a mi este me resulta muy útil.
private string AcortarCifra(decimal cifra)
{
string strCifra = Convert.ToString(cifra);
int dondeestalacoma = strCifra.IndexOf(',');
string partedecimal;
string parteentera;
if (dondeestalacoma != -1)
{
if (strCifra.Length > (dondeestalacoma + 2))
{
partedecimal = strCifra.Substring(dondeestalacoma + 1, 2);
parteentera = strCifra.Substring(0, dondeestalacoma);
strCifra = parteentera + "," + partedecimal;
}
}
else
strCifra = strCifra + ",00";
return strCifra;
}
20 marzo 2012
Diferencias entre Convert.ToString(valor) y valor.ToString()
Acabo de aprender que es mejor usar Convert.ToString(valor) habitualmente en lugar de valor.ToString() porque con la primera opción si valor vale NULL lo transforá en blanco. Y en otro lugar, no. Daria error. La segunda opción es solo rentable cuando el valor nunca valga NULL.
Entonces es aconsejable olvidarnos de la segunda opción usando siempre la primera. Para prevenir.
Entonces es aconsejable olvidarnos de la segunda opción usando siempre la primera. Para prevenir.
19 diciembre 2011
C#: ¿Cómo se ordena una TList ?
Es muy sencillo. De tan fácil como es hasta cavilé demasiado.
Teniendo una lista:
TList listaDePersonasDeContacto = DataRepository.PersonsContacto.GetAll();
y esta se ordena así:
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString());
Por cierto, PersonasContactoColumn.StrApellido1.ToString() devuelve la columna por la que queremos ordenar. En este caso el primer apellido del contacto.
Saludos!
Gracias Edwin por explicarmelo porque yo me calenté mucho la cabeza. ¡Con lo tirao que está!
P.D.: Haciendo esto, indico que en caso de que haya coincidencia, mire el segundo apellido
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString() + ", " + PersonasContactoColumn.StrApellido2.ToString());
Teniendo una lista:
TList
y esta se ordena así:
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString());
Por cierto, PersonasContactoColumn.StrApellido1.ToString() devuelve la columna por la que queremos ordenar. En este caso el primer apellido del contacto.
Saludos!
Gracias Edwin por explicarmelo porque yo me calenté mucho la cabeza. ¡Con lo tirao que está!
P.D.: Haciendo esto, indico que en caso de que haya coincidencia, mire el segundo apellido
listaDePersonasDeContacto.Sort(PersonasContactoColumn.StrApellido1.ToString() + ", " + PersonasContactoColumn.StrApellido2.ToString());
12 diciembre 2011
C #; Cómo crear checkbox en tiempo de ejecución.
En este caso he subido código que crea checkbox en tiempo de ejecución. Porque el report que lo utiliza requiere que por cada archivo localizado en un directorio (incluyendo subdirectorios) se añada así al informe, en lugar de como texto normal en una label normal. Supongo que es un pijotada pero me ha servido para aprender una cosa nueva. Asique ya me podria ir a la cama sino fuese porque son las 9:20.
private void CrearCheckbox(string texto)
{
posicionY += 23; /*incremento la posicionY (esta variabled dtermina donde se va a ubicar el checkbox)*/
try
{
Detail.HeightF = posicionY; /*aumento la longitud del detalle*/
DevExpress.XtraReports.UI.XRCheckBox chkNombreFichero1 = new XRCheckBox(); /*creo el checkbox*/
chkNombreFichero1.Name = "chk" + numeroDeFicheros.ToString(); /*le doy nombre*/
chkNombreFichero1.WidthF = 615; /*le doy ancho */
chkNombreFichero1.HeightF = 23; /*le doy altura*/
chkNombreFichero1.Text = texto; /*le doy el mismo valor que el nombre del fichero*/
chkNombreFichero1.TopF = posicionY - 23; /*lo coloco en la posición*/
chkNombreFichero1.Checked = true; /*lo activo*/
chkNombreFichero1.Visible = true;
numeroDeFicheros += 1; //incremento el valor para que los nombres no se repitan
Detail.Controls.Add(chkNombreFichero1);
}
catch (Exception ex)
{
}
}
Saludos desde Albacete.
private void CrearCheckbox(string texto)
{
posicionY += 23; /*incremento la posicionY (esta variabled dtermina donde se va a ubicar el checkbox)*/
try
{
Detail.HeightF = posicionY; /*aumento la longitud del detalle*/
DevExpress.XtraReports.UI.XRCheckBox chkNombreFichero1 = new XRCheckBox(); /*creo el checkbox*/
chkNombreFichero1.Name = "chk" + numeroDeFicheros.ToString(); /*le doy nombre*/
chkNombreFichero1.WidthF = 615; /*le doy ancho */
chkNombreFichero1.HeightF = 23; /*le doy altura*/
chkNombreFichero1.Text = texto; /*le doy el mismo valor que el nombre del fichero*/
chkNombreFichero1.TopF = posicionY - 23; /*lo coloco en la posición*/
chkNombreFichero1.Checked = true; /*lo activo*/
chkNombreFichero1.Visible = true;
numeroDeFicheros += 1; //incremento el valor para que los nombres no se repitan
Detail.Controls.Add(chkNombreFichero1);
}
catch (Exception ex)
{
}
}
Saludos desde Albacete.
08 diciembre 2011
En C#: listado de todos los archivos encontrados en un directorio (incluyendo subdirectorios)
Para desarrollar este código utilizo un botón (llamado btnVer) y una caja de texto (llamada txtContenido).
En la caja de texto cargo los nombres de todos los ficheros contenidos en la ruta donde está el proyecto (no olvidemos que este código nació para probar un algoritmo que en el trabajo no me salia, y en casa sí). El botón hace la llamada a los procesos.
Así es el resultado del formulario al ejecutar el programa:

Código del botón:
private void btnVer_Click(object sender, EventArgs e)
{
txtContenedor.Text = "";
ExtraerFicherorDelSubDirectorio(Application.StartupPath);
}
Ahora el código de ExtraerFicherorDelSubDirectorio (string ruta) que es una función recursiva:
private void ExtraerFicherorDelSubDirectorio(string ruta)
{
DirectoryInfo oDirectorio = new DirectoryInfo(ruta);
//obtengo ls ficheros contenidos en la ruta
foreach (FileInfo file in oDirectorio.GetFiles())
{
txtContenedor.Text += file.Name+"\n";
}
//obtego los subdirectorios que cuelgan de la ruta
foreach (DirectoryInfo subdirectorios in oDirectorio.GetDirectories())
{
ExtraerFicherorDelSubDirectorio(subdirectorios.FullName);
}
}
Saludos.
En la caja de texto cargo los nombres de todos los ficheros contenidos en la ruta donde está el proyecto (no olvidemos que este código nació para probar un algoritmo que en el trabajo no me salia, y en casa sí). El botón hace la llamada a los procesos.
Así es el resultado del formulario al ejecutar el programa:

Código del botón:
private void btnVer_Click(object sender, EventArgs e)
{
txtContenedor.Text = "";
ExtraerFicherorDelSubDirectorio(Application.StartupPath);
}
Ahora el código de ExtraerFicherorDelSubDirectorio (string ruta) que es una función recursiva:
private void ExtraerFicherorDelSubDirectorio(string ruta)
{
DirectoryInfo oDirectorio = new DirectoryInfo(ruta);
//obtengo ls ficheros contenidos en la ruta
foreach (FileInfo file in oDirectorio.GetFiles())
{
txtContenedor.Text += file.Name+"\n";
}
//obtego los subdirectorios que cuelgan de la ruta
foreach (DirectoryInfo subdirectorios in oDirectorio.GetDirectories())
{
ExtraerFicherorDelSubDirectorio(subdirectorios.FullName);
}
}
Saludos.
08 octubre 2011
Ejercicio hecho en C # que carga en una combo subcadeenas escritas en un textbox y separadas por ;
Este ejercicio, como reza el titulo del articulo, consiste en cargar en la combo cmbDatos, las palabras delimitadas por ; que se escriben en txtString.
El uso del ArrayList lista es puramente para mi comodidad porque así, cuando probaba la aplicación iba corroborado que subcadenas se extraian.
private void btnCargar_Click(object sender, EventArgs e)
{
cmbDatos.Items.Clear();
ArrayList lista = new ArrayList();
string subcadena;
string cadena = txtString.Text;
while (cadena.Length > 0)
{
int indice = cadena.IndexOf(';');
if (indice > 0)
subcadena = cadena.Substring(0, indice);
else
{
subcadena = cadena;
cadena = "";
}
lista.Add(subcadena);
int numeroDeCararteres= (cadena.Length-1) - indice;
if (numeroDeCararteres>-1)
cadena = cadena.Substring(indice+ 1,numeroDeCararteres);
}
for (int i = 0; i < lista.Count; i++)
{
cmbDatos.Items.Add(lista[i].ToString());
}
}
Saludos.
El uso del ArrayList lista es puramente para mi comodidad porque así, cuando probaba la aplicación iba corroborado que subcadenas se extraian.
private void btnCargar_Click(object sender, EventArgs e)
{
cmbDatos.Items.Clear();
ArrayList lista = new ArrayList();
string subcadena;
string cadena = txtString.Text;
while (cadena.Length > 0)
{
int indice = cadena.IndexOf(';');
if (indice > 0)
subcadena = cadena.Substring(0, indice);
else
{
subcadena = cadena;
cadena = "";
}
lista.Add(subcadena);
int numeroDeCararteres= (cadena.Length-1) - indice;
if (numeroDeCararteres>-1)
cadena = cadena.Substring(indice+ 1,numeroDeCararteres);
}
for (int i = 0; i < lista.Count; i++)
{
cmbDatos.Items.Add(lista[i].ToString());
}
}
Saludos.
08 mayo 2011
En C sharp, seleccionar registros en una base de datos Access (versión 97) usando las librerias ODBC
Aqui escribo el ódigo para seleccionar el máximo valor de un campo determinado:
private void IdMasAlto()
{
DatosConexionABaseDeDatos odatosConexion = new DatosConexionABaseDeDatos();
OleDbConnection conexion = odatosConexion.getConexion();
conexion.Open();
DataSet ds = new DataSet();
DataTable dt = new DataTable();
string strSQL = "SELECT MAX(IdTipo) AS ultimo FROM Tipo";
//La consulta únicamente devolverá un registro de una columna: Un valor.
OleDbDataAdapter oAdaptador= new OleDbDataAdapter(strSQL, conexion);
oAdaptador.Fill(ds, "elultimo");
dt = ds.Tables["elultimo"];
DataRow fila =dt.Rows[0];
//ID es una propiedad
ID = Convert.ToInt32(fila["ultimo"].ToString());
conexion.Close();
}
Este códigio, modificandolo, servirá para recorrer varios registros devuelvos. Quedando así: if (dt.Rows.Count == 0)
this.lblUsuario.Text = "No existe el usuario...";
else
{
foreach (System.Data.DataRow fila in dt.Rows)
{
this.lblUsuario.Text = "Bienvenido " + fila["nombre"].ToString();
}
}
Por supuesto, y antes de marchar, recordar que hay que hacer las siguientes importaciones antes de empezar, en las primeras líneas:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
Saludos ;)
12 abril 2011
C Sharp, en una función contructora no debe faltar,...
31 marzo 2011
Curiosidades de C Sharp y SQL (1)
El otro día me descuerné pensando qué podría estar equivodo en esta sentencia SQL, ¿y adivinan el error?:
string SQL = "INSERT INTO Programa (Nombre, Anio, Version, Tipo, EnISO, InstaladoEnPortatil, InstaladoEnPC, Observaciones, Descripcion, Fabricante, CuandoCaduca, EsLibre, ParaWindows, ParaLinux, ParaMacintosh, ConCrack, Serial, Usuario, Password) VALUES ('" + _programa.nombre.ToUpper() + "', '" + _programa.anio + "', '" + _programa.version + "', " + _programa.codTipo + ", " + _programa.enISO + ", " + _programa.instaladoEnPortatil + ", " + _programa.instaladoEnPC + ", '" + _programa.observaciones + "', '" + _programa.descripcion + "', '" + _programa.fabricante + "', '" + _programa.cuandoCaduca + "', " + _programa.esLibre + ", " + _programa.paraWindows + ", " + _programa.paraLinux + ", " + _programa.paraMacintosh + ", " + _programa.conCrack + ", '" + _programa.serial + "', '" + _programa.usuario + "', '" +_programa.password + "')";
¿Ya la han ojeado bien?
Pues el problema era que Password al ser una palabra reservada no se puede utilizar como nombre para un campo de una tabla con base de datos Access. Entonces probé a cambiarla por ClaveDeAcceso, y el error, Instrucción SQL erronea, se esfumó.
Saludos.
string SQL = "INSERT INTO Programa (Nombre, Anio, Version, Tipo, EnISO, InstaladoEnPortatil, InstaladoEnPC, Observaciones, Descripcion, Fabricante, CuandoCaduca, EsLibre, ParaWindows, ParaLinux, ParaMacintosh, ConCrack, Serial, Usuario, Password) VALUES ('" + _programa.nombre.ToUpper() + "', '" + _programa.anio + "', '" + _programa.version + "', " + _programa.codTipo + ", " + _programa.enISO + ", " + _programa.instaladoEnPortatil + ", " + _programa.instaladoEnPC + ", '" + _programa.observaciones + "', '" + _programa.descripcion + "', '" + _programa.fabricante + "', '" + _programa.cuandoCaduca + "', " + _programa.esLibre + ", " + _programa.paraWindows + ", " + _programa.paraLinux + ", " + _programa.paraMacintosh + ", " + _programa.conCrack + ", '" + _programa.serial + "', '" + _programa.usuario + "', '" +_programa.password + "')";
¿Ya la han ojeado bien?
Pues el problema era que Password al ser una palabra reservada no se puede utilizar como nombre para un campo de una tabla con base de datos Access. Entonces probé a cambiarla por ClaveDeAcceso, y el error, Instrucción SQL erronea, se esfumó.
Saludos.
19 marzo 2011
En C sharp, eliminar registros en una base de datos Access (versión 97) usando las librerias ODBC
Aqui escribo el ódigo para modificar un registro utilizando las mismas herramientas y lois mismos métdos que seusaron para hacer la inserciónen el articulo En C sharp, insertar registros en una base de datos Access (versión 97) usando las librerias ODBC
Al igual que en el anterior, importo las siguientes librerias:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
y trabajo en la clase Tipo.
public void Eliminar(Tipo _tipo)
{
DatosConexionABaseDeDatos odatosConexion = new DatosConexionABaseDeDatos();
OleDbConnection conexion = odatosConexion.getConexion();
string eliminarSQL = "DELETE FROM Tipo WHERE IdTipo=" + _tipo.id;
conexion.Open();
OleDbDataAdapter oAdaptador = new OleDbDataAdapter(eliminarSQL, conexion);
OleDbCommandBuilder oBuilder = new OleDbCommandBuilder(oAdaptador);
DataSet oDsTipo = new DataSet("Tipo");
oAdaptador.Fill(oDsTipo, "Tipo");
conexion.Close();
}
Este mantiene diferencias con el sucesor, como que nunca se seleccionan todos los campos, y en cambio se ejecuta una sentencia DELETE. Además se ahorran las líneas donde se creabe un objeto Row agregandose como nuevo, porque obviamente esto no añade sino que suprime registros que ya existen.
En C sharp, modificar registros en una base de datos Access (versión 97) usando las librerias ODBC
Aqui escribo el ódigo para modificar un registro utilizando las mismas herramientas y lois mismos métdos que seusaron para hacer la inserckión en el articulo En C sharp, insertar registros en una base de datos Access (versión 97) usando las librerias ODBC
Al igual que en el anterior, importo las siguientes librerias:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
y trabajo en la clase Tipo.
Sin más preámbulos aquí está el código para modificar un registro.
public void ModificarTipoExistente(Tipo _tipo)
{
DatosConexionABaseDeDatos odatosConexion = new DatosConexionABaseDeDatos();
OleDbConnection conexion = odatosConexion.getConexion();
string updateSQL = "UPDATE Tipo SET Descripcion='" + _tipo.descripcion + "', Tipo='" + _tipo.tipo + "' WHERE IdTipo=" + _tipo.id;
conexion.Open();
OleDbDataAdapter oAdaptador = new OleDbDataAdapter(updateSQL, conexion);
OleDbCommandBuilder oBuilder = new OleDbCommandBuilder(oAdaptador);
DataSet oDsTipo = new DataSet("Tipo");
oAdaptador.Fill(oDsTipo, "Tipo");
conexion.Close();
}
Este mantiene diferencias con el sucesor, como que nunca se seleccionan todos los campos, y en cambio se ejecuta una sentencia UPDATE. Además se ahorran las líneas donde se creabe un objeto Row agregandose como nuevo, porque obviamente esto no añade sino que actualiza registros que ya existen.
13 marzo 2011
En C sharp, insertar registros en una base de datos Access (versión 97) usando las librerias ODBC
Ayer, tras muchas horas buscando por Internet un ejemplo válido de cómo agregar registros en una base de datos Access, versión 97, utilizando las funciones de las librerias ODBC, di, al rededor de las 6 de la tarde con esta página web 32.36.2.Use DataTable to insert a Row
Aquí dejo mí codigio, logrado en base a esa página que os he dicho:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace GesPro.Tipo
{
class Tipo
{
string tipo;
string descripcion;
//constructor sin parametros de la clase
public Tipo()
{
this.descripcion = "";
this.tipo = "";
}
//constructor con parametros de la clase
public Tipo(string _tipo, string _descripcion)
{
this.descripcion = _descripcion;
this.tipo = _tipo;
}
// función que inserta nuevos regisrtros en la tabla Tipo de la base de datos GesPro.mdb
public void InsertarNuevoTipo(Tipo _tipo)
{
string ruta = System.IO.Directory.GetCurrentDirectory() + @"\GesPro.mdb"; //indica la ruta donde está la base de dxatos
string cadenaDeConexion = @"Provider=Microsoft.JET.OLEDB.4.0;" + @"data source=" + ruta; //establece cadena de conexión con la base de datos
OleDbConnection conexion = new OleDbConnection(cadenaDeConexion); //creo un objeto conexion
string seleccionarTodosLosRegistros = "SELECT * FROM Tipo";
conexion.Open(); //abro conexión
OleDbDataAdapter oAdaptador = new OleDbDataAdapter(seleccionarTodosLosRegistros,conexion); //creo un adaptador con una sql que selecciona todos los registros
OleDbCommandBuilder oBuilder = new OleDbCommandBuilder(oAdaptador);
DataSet oDsTipo = new DataSet("Tipo"); //creo un objeto dataset
oAdaptador.Fill(oDsTipo,"Tipo");
DataTable oTablaTipo = oDsTipo.Tables["Tipo"]; //creo una tabla para datos y le añado el nuevo registro campo a campo
DataRow oRow = oTablaTipo.NewRow();
oRow["Tipo"] = _tipo.tipo;
oRow["Descripcion"] = _tipo.descripcion;
oTablaTipo.Rows.Add(oRow);
oAdaptador.Update(oDsTipo, "Tipo"); //actualizo el objeto adaptador
conexion.Close();
}
}
}
26 septiembre 2010
En C#: Gestor de directorios
Basandome en En C#: Cómo montar un navegador en un TreeView ( 2º versión) hice los apaños necesarios para que ahora me sacara los subdirectorios del direwctorio raiz llamado Documentos y ubicado dentro de la carpeta Debug del proyecto. Algo que se hace así:
Application.StartupPath + "\\Documentos";
Si, y es esa barra, y no esta /. Aviso porque luego la piciamos confundiendonos con Linux.
Las diferencias enrtre un proyecto y otro son:
1. Ahora cargo el contenido de una carpeta, sus subdirectorios. Utilizando como nodo-raiz uno que tenga por ruta la ruta-inicial, que vale la concatenación de Application.StartupPath más el nombre del directorio raiz. Para el nombre del nodo-raiz, poodemos usar la \tipica o el nombre de la carpeta contanedora. Anteriormente, en la segunda versión, usabamos una función que cargaba los drivers, ahora no, ahora cargamos los subdirectorios. Así:
public void Inicio2()
{
//lo primero, cargsr el contenido de la carpeta raiz
rutaInicial = Application.StartupPath + "\\Documentos";
DirectoryInfo dirInf = new DirectoryInfo(rutaInicial);
try
{
foreach (DirectoryInfo subdir in dirInf.GetDirectories())
{
//de cada directorio se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = subdir.Name;
nodo.Ruta = subdir.FullName;
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text = "";
}
}
catch (Exception ex)
{
//en la barra de estado uestro los errores q se pueden gnerar (falta de derechos o unidad no lista)
StateLblInformacion.Text = ex.Message;
}
}
2. La otra diferencia importante, no es nada del otro mundo: deshabilitar el botón que permite suprimir un directorio y la opción del menú contextual. Y esto se hace en el evento AfterSelect del control TreeView. Así:
if (NodoSeleccionado.Ruta.CompareTo(NodoRaiz.Ruta) == 0)
BtnBorrarDirectorio.Enabled = false;
else
BtnBorrarDirectorio.Enabled = true;
MenuItemBorrarDirectorio.Enabled = BtnBorrarDirectorio.Enabled;
Saludos.
Application.StartupPath + "\\Documentos";
Si, y es esa barra, y no esta /. Aviso porque luego la piciamos confundiendonos con Linux.
Las diferencias enrtre un proyecto y otro son:
1. Ahora cargo el contenido de una carpeta, sus subdirectorios. Utilizando como nodo-raiz uno que tenga por ruta la ruta-inicial, que vale la concatenación de Application.StartupPath más el nombre del directorio raiz. Para el nombre del nodo-raiz, poodemos usar la \tipica o el nombre de la carpeta contanedora. Anteriormente, en la segunda versión, usabamos una función que cargaba los drivers, ahora no, ahora cargamos los subdirectorios. Así:
public void Inicio2()
{
//lo primero, cargsr el contenido de la carpeta raiz
rutaInicial = Application.StartupPath + "\\Documentos";
DirectoryInfo dirInf = new DirectoryInfo(rutaInicial);
try
{
foreach (DirectoryInfo subdir in dirInf.GetDirectories())
{
//de cada directorio se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = subdir.Name;
nodo.Ruta = subdir.FullName;
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text = "";
}
}
catch (Exception ex)
{
//en la barra de estado uestro los errores q se pueden gnerar (falta de derechos o unidad no lista)
StateLblInformacion.Text = ex.Message;
}
}
2. La otra diferencia importante, no es nada del otro mundo: deshabilitar el botón que permite suprimir un directorio y la opción del menú contextual. Y esto se hace en el evento AfterSelect del control TreeView. Así:
if (NodoSeleccionado.Ruta.CompareTo(NodoRaiz.Ruta) == 0)
BtnBorrarDirectorio.Enabled = false;
else
BtnBorrarDirectorio.Enabled = true;
MenuItemBorrarDirectorio.Enabled = BtnBorrarDirectorio.Enabled;
Saludos.
05 septiembre 2010
Consejos de Rodrigo para futuro código con ASP, JavaScript, C Sharp, componentes Devexpress y no recuerdo qué más
El viernes el colega de trabajo Rodrigo se pasó buen rato ayudandome a resolver un código sencillo, pero repleto de errores por mi novatez.
Primero, el código javascript se tiene que separar de los archivos aspx porque así se gana limpieza. Estos nuevos archivos se llamarán como los aspx pero con extensión js. Y serán incluidos en los archivos form. De esta manera, siendo esto un ejemlo:
Y ojito con qué nombre ponen a ClientInstanceName, porque en los .js, a las variables de los asp, se las conoce por ese nombre. Se sugiere que el ID de un control y el clientinstancename sean el mismo.
Segundo, javascript es C. Sin enbargo, como en nuestro caso usamos herramientas DevExpress, tendremos que usar los métodos de estas herramientas. Para saber cuales son, pues vamos a la ayuda, y allí tecleamos el nombre del control.
Tercero, ah! Ojo, ojito... No podemos usar un visible común. Sino, que tenemos que usar un clientVisible. Porque la tenemos que visualizar o dejar de hacerlo, de lado del cliente, y no del lado del servidor. En tonces si usamos Visible, nos va a fallar.
Consejo, no vayan de listos, y... Otra cosa, observen si el navegdor seleccionado no dibuja una señal de advertencia.. Porque si lo hace, en el código tienen un error, aunque no se haya detectado en el depurador.
Otros consejos, pero de diseño: usen tablas, y siempre con el mismo número de columnas. Y otra cosa. Uff, no paro. Utilicen y reutilicen UserForm, porque así les va a cundir más.
Saludos.
Primero, el código javascript se tiene que separar de los archivos aspx porque así se gana limpieza. Estos nuevos archivos se llamarán como los aspx pero con extensión js. Y serán incluidos en los archivos form. De esta manera, siendo esto un ejemlo:
Y ojito con qué nombre ponen a ClientInstanceName, porque en los .js, a las variables de los asp, se las conoce por ese nombre. Se sugiere que el ID de un control y el clientinstancename sean el mismo.Tercero, ah! Ojo, ojito... No podemos usar un visible común. Sino, que tenemos que usar un clientVisible. Porque la tenemos que visualizar o dejar de hacerlo, de lado del cliente, y no del lado del servidor. En tonces si usamos Visible, nos va a fallar.
Consejo, no vayan de listos, y... Otra cosa, observen si el navegdor seleccionado no dibuja una señal de advertencia.. Porque si lo hace, en el código tienen un error, aunque no se haya detectado en el depurador.
Otros consejos, pero de diseño: usen tablas, y siempre con el mismo número de columnas. Y otra cosa. Uff, no paro. Utilicen y reutilicen UserForm, porque así les va a cundir más.
Saludos.
23 agosto 2010
Traducir componentes DevExpress
Estaba de los nervios esta mañana por no poder lograr este objetivo: traducir los componentes DevExpress del inglés al castellano, cuando mi supervisor a las 12.30 ha acudido a recatarme. Le he explicado qué quería hacer y me ha llamado melón (en su argot: tonto). Al momento ha cogido el mouse y se ha puesto a teclear en google y ha encontrado cómo hacerlo. Yo flipaba pensando qué del modo que él lo estaba haciendo se ahorraban muchos calentamientos de cabeza, a la par, que quedaba más profesional. Pero no logré quedarme muy bien con la coplilla, así que ahora, a las 16.51, me puse a buscar la soluciónj en google. No sé si será la misma.
Encontré esto, escrito en C sharp:
1. Añadir dos lineas para especificar el idioma en el proyecto (form_load):
// Necesario para traducir los componentes a Español2. Añadir la carpeta con los resources en la raíz del proyecto. Esta carpeta la puedes conseguir en el sitio oficial de DevExpress, donde deberás seleccionar el idioma deseado y tu versión de DevExpress.
/*1º linea*/
System.Threading.Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo("es-ES");
/*2º linea*/
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("es");
Los pasos los he copiado literalmente de http://www.joselite.com/traducir-componentes-devexpress. Al que pido perdón si molesto. Y doy gracias por su ayuda.
23 mayo 2010
Ideas para proyectos propios (I) y (II)
Utilizando C sharp haré una aplicación que transfiera archivos de un teléfono móvil a un ordenador a través de bluetooth y viceversa.
Y luego, haré otra para realizar copias de seguridad de la agenda del teléfono a una base de datos dl ordenador. Así mismo esta copia podrá ser exportada al télefono.
Estos dos links me servirán de algo:
Transferring files and monitoring Bluetooth ports in C# Scanning for bluetooth devices
Importante libreria: http://www.desarrollomobile.net/devmob/BluetoothLibrary/tabid/54/Default.aspx
A ver cuánto tardo.
02 mayo 2010
En C#: Cómo montar un navegador en un TreeView ( 2º versión)
Para desarrollar esta segunda versión, que sustituye, mejorando a "Más código en C#: Cómo montar un navegador en un TreeView", cree una clase. La llamé "SuperTreeNode" y hereda todo de la clase "TreeNode" perteneciente a System.Windows.Forms.
Código de la clase SuperTreeNode:
class SuperTreeNode:TreeNode //los dos puntos preceden a la clase superior
{
private string ruta;
public SuperTreeNode()
: base()
{
this.ruta = "";
}
public SuperTreeNode(string ruta)
: base()
{
this.ruta = ruta;
}
public SuperTreeNode(string texto, string ruta):base(texto)
{
this.ruta = ruta;
}
public string Ruta
{
get { return ruta; }
set { ruta = value; }
}
}
El código de la clase donde se realizan las funciones relativas a la carga de los directorios, en esta versión, se cargan cuando se procede a utilizarlos, resolviendo asi el problemas con la memoria RAM, que antes se veia afectada.
Código de la clase del formulario principal, donde uso System.IO;:
public partial class Form1 : Form
{
SuperTreeNode NodoRaiz;
public Form1()
{
InitializeComponent();
NodoRaiz = new SuperTreeNode();
NodoRaiz.ImageIndex = 0;
NodoRaiz.Text = "MI PC"; //doy un texto al nodo primario
TreeVArboleda.Nodes.Add(NodoRaiz); //el nodoprimario lo agrego al arbol
}
private void Form1_Load(object sender, EventArgs e)
{
Inicio();
TreeVArboleda.ExpandAll();
}
public void Inicio()
{
//lo primero, sacar las unidades.
DriveInfo[] drivers = DriveInfo.GetDrives();//se obtienen todos los drivers
foreach (DriveInfo driver in drivers)
{
try
{
//de cada driver se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = driver.Name; //nombre
nodo.Ruta = driver.RootDirectory.FullName; //ruta
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text ="";
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
private void TreeVArboleda_AfterSelect(object sender, TreeViewEventArgs e)
{
SuperTreeNode nodo = (SuperTreeNode)e.Node;
TxtRutaActual.Text = nodo.Ruta; //obtengo la ruta seleccionada
try
{
//obtengo el contenido (subdirectorios) del directorio de la ruta
DirectoryInfo unDirectorio = new DirectoryInfo(TxtRutaActual.Text);
DirectoryInfo[] subdirectorios = unDirectorio.GetDirectories();
nodo.Nodes.Clear();
foreach (DirectoryInfo directorios in subdirectorios)
{
try
{
//por cada subdirectorio cro un nodo llamado hijo al que anclo al nodo creado al principio
SuperTreeNode hijo = new SuperTreeNode(directorios.Name, directorios.FullName);
nodo.Nodes.Add(hijo);
StateLblInformacion.Text = "";
}
catch (Exception ex2)
{
StateLblInformacion.Text = ex2.Message;
}
}
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
}
Saludos.
Código de la clase SuperTreeNode:
class SuperTreeNode:TreeNode //los dos puntos preceden a la clase superior
{
private string ruta;
public SuperTreeNode()
: base()
{
this.ruta = "";
}
public SuperTreeNode(string ruta)
: base()
{
this.ruta = ruta;
}
public SuperTreeNode(string texto, string ruta):base(texto)
{
this.ruta = ruta;
}
public string Ruta
{
get { return ruta; }
set { ruta = value; }
}
}
El código de la clase donde se realizan las funciones relativas a la carga de los directorios, en esta versión, se cargan cuando se procede a utilizarlos, resolviendo asi el problemas con la memoria RAM, que antes se veia afectada.
Código de la clase del formulario principal, donde uso System.IO;:
public partial class Form1 : Form
{
SuperTreeNode NodoRaiz;
public Form1()
{
InitializeComponent();
NodoRaiz = new SuperTreeNode();
NodoRaiz.ImageIndex = 0;
NodoRaiz.Text = "MI PC"; //doy un texto al nodo primario
TreeVArboleda.Nodes.Add(NodoRaiz); //el nodoprimario lo agrego al arbol
}
private void Form1_Load(object sender, EventArgs e)
{
Inicio();
TreeVArboleda.ExpandAll();
}
public void Inicio()
{
//lo primero, sacar las unidades.
DriveInfo[] drivers = DriveInfo.GetDrives();//se obtienen todos los drivers
foreach (DriveInfo driver in drivers)
{
try
{
//de cada driver se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = driver.Name; //nombre
nodo.Ruta = driver.RootDirectory.FullName; //ruta
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text ="";
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
private void TreeVArboleda_AfterSelect(object sender, TreeViewEventArgs e)
{
SuperTreeNode nodo = (SuperTreeNode)e.Node;
TxtRutaActual.Text = nodo.Ruta; //obtengo la ruta seleccionada
try
{
//obtengo el contenido (subdirectorios) del directorio de la ruta
DirectoryInfo unDirectorio = new DirectoryInfo(TxtRutaActual.Text);
DirectoryInfo[] subdirectorios = unDirectorio.GetDirectories();
nodo.Nodes.Clear();
foreach (DirectoryInfo directorios in subdirectorios)
{
try
{
//por cada subdirectorio cro un nodo llamado hijo al que anclo al nodo creado al principio
SuperTreeNode hijo = new SuperTreeNode(directorios.Name, directorios.FullName);
nodo.Nodes.Add(hijo);
StateLblInformacion.Text = "";
}
catch (Exception ex2)
{
StateLblInformacion.Text = ex2.Message;
}
}
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
}
Saludos.
17 abril 2010
Cómo en C# obtener el tamaaño de un directorio
Esta misma función la escribí en el post anterior, pero creo necesario volverla a escribir porque puede ser útil al márgen de la otra utilidad que le dí.
private long ObtenerPesoDirectorioEnBytes(DirectoryInfo d)
{
long pesoDir = 0;
try
{
// Totalizar tamaño de archivos
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
pesoDir += fi.Length;
}
// Totalizar tamaño sub-directorios
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
pesoDir += ObtenerPesoDirectorioEnBytes(di);
}
}
catch (Exception exp)
{
// Código para la excepción va aquí
}
return pesoDir;
}
Por su puesto, gracias a quién colgó por internet este código, del que yo no he cambiado nada.
Saludos
private long ObtenerPesoDirectorioEnBytes(DirectoryInfo d)
{
long pesoDir = 0;
try
{
// Totalizar tamaño de archivos
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
pesoDir += fi.Length;
}
// Totalizar tamaño sub-directorios
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
pesoDir += ObtenerPesoDirectorioEnBytes(di);
}
}
catch (Exception exp)
{
// Código para la excepción va aquí
}
return pesoDir;
}
Por su puesto, gracias a quién colgó por internet este código, del que yo no he cambiado nada.
Saludos
Suscribirse a:
Entradas (Atom)