// Código para enviar las pulsaciones de teclas
Microsoft.VisualBasic.Interaction.AppActivate(f.Text);//Activa la aplicación. f es el formulario creado anteriormente para pruebas
f.Focus();// Hace falta también esto por lo visto.
Util.EnviarTeclas(5000, "{TAB}");//Cuadro de diálogo. Pasar a "no"
Util.EnviarTeclas(6000, "{ENTER}");//Cuadro de diálogo. ENTER.
// Código en Utils
public static void EnviarTeclas(int TiempoEspera, string teclas) {
Thread t = new Thread(new ParameterizedThreadStart(AEjecutarPorEnvioTeclas));
EnvioTeclas et = new EnvioTeclas(TiempoEspera,teclas);
t.Start(et);
}
public static void AEjecutarPorEnvioTeclas(Object EnvTecl) {
EnvioTeclas aux = EnvTecl as EnvioTeclas;
Thread.Sleep(aux.espera);
SendKeys.SendWait(aux.teclas);
}
public class EnvioTeclas {
public int espera;
public string teclas;
public EnvioTeclas(int espera, string teclas) {
this.espera = espera;
this.teclas = teclas;
}
}
24/5/11
Envío de teclas a aplicaciones (para pruebas automáticas)
Uno de los problemas se produce cuando se muestra un MessageBox. No hay manera de cerrarlo así que: a enviar teclas.
16/5/11
Crear filas de prueba
A destacar el tema de que hay que crear una tabla para incluir la fila en ella.
private static DS.AGPROVRow _ProvRow;
public static DS.AGPROVRow ProvRow {
get {
if (_ProvRow == null) {
DS.AGPROVDataTable aux = new DS.AGPROVDataTable();
_ProvRow = aux.NewAGPROVRow();
_ProvRow.ID = 99;
_ProvRow.NOMB = "Prueba Grabar 1";
}
return _ProvRow;
}
}
27/4/11
Comparar el contenido de dos filas
public static bool ContenidoRowsEsIgual<T>(T row1, T row2) where T : DataRow {
bool result = true;
if (!row1.GetType().Equals(row2.GetType())) {
throw new Exception("Las filas no son del mismo tipo");
}
DataRow r1 = row1 as DataRow;
DataRow r2 = row2 as DataRow;
for (int i = 0; i < r1.ItemArray.Length; i++) {
if (!r1[i].Equals(r2[i])) {
result = false;
}
}
return result;
}
24/11/10
Mostrar Fechas en Oracle
Mostrar fecha y hora
Para probarlo:
Más información en:
http://www.oradev.com/oracle_date_format.jsp
to_char(campo_fecha,'DD/MM/YYYY HH24:MI:SS')
Para probarlo:
select to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual;
Más información en:
http://www.oradev.com/oracle_date_format.jsp
12/11/10
Roles de un usuario de windows
Adaptado de código de Jose Manuel Alarcón.
de la página: http://www.netveloper.com/2004/12/c%C3%B3mo-obtener-los-roles-a-los-que-pertenece-un-usuario-de-windows/
Me falló como a Javier Carrillo y lo solucioné con:
de la página: http://www.netveloper.com/2004/12/c%C3%B3mo-obtener-los-roles-a-los-que-pertenece-un-usuario-de-windows/
Me falló como a Javier Carrillo y lo solucioné con:
using System;
using System.Collections;
using System.Security.Principal;
using System.Reflection;
using System.IO;
public
class Prueba
{
public static void Main()
{
StreamWriter sw = File.CreateText("roles.txt");
foreach (IdentityReference Role in WindowsIdentity.GetCurrent().Groups.Translate(typeof(NTAccount)))
{
Console.WriteLine(Role.Value);
sw.WriteLine(Role.Value);
}
Console.ReadLine();
sw.Close();
}
}
27/7/10
Añadir consultas a un DataAdapter por código
El problema es que si se hace gráficamente, al rehacer el DataSet, se borran.
Para solucionarlo hay que heredar del DataAdapter generado y crear los Fill que se quieran.
Para solucionarlo hay que heredar del DataAdapter generado y crear los Fill que se quieran.
public class AdapterModificado : DSTableAdapters.EnteTableAdapter
{
public void FillByNif(DS.EnteDataTable t,string nif)
{
SqlCeCommand aux = this.CommandCollection[0];
this.CommandCollection[0] = new SqlCeCommand("select * from ente where nif = @nif");
this.CommandCollection[0].Connection = this.Connection;
this.CommandCollection[0].Parameters.Add("@nif", nif);
this.Fill(t);
this.CommandCollection[0] = aux;
}
}
13/4/10
Usar servicios Web desde C# cómodamente
Se usa
Se encuentra por ejemplo en:
Hay que estar en la carpeta correspondiente y desde línea de comandos usar
genera un fichero de c# (por defecto) con el que poder llamar a los métodos web
Ejemplo:
Para usarlo:
wsdl.exe
Se encuentra por ejemplo en:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
Hay que estar en la carpeta correspondiente y desde línea de comandos usar
wsdl [URL servicio]
genera un fichero de c# (por defecto) con el que poder llamar a los métodos web
Ejemplo:
wsdl http://localhost/Service1.asmx
Para usarlo:
serv = new Service1();
serv.Url = @"http://localhost/Service1.asmx";
serv.CookieContainer = new System.Net.CookieContainer();
serv.MetodoWeb("Dato para método",5); // El fichero generado tiene los métodos web como métodos normales del objeto
Sql Server desde línea de comandos (sqlcmd)
Se usa
Está en
Las mayúsculas y minúsculas son importantes (curioso en Windows)
ejemplo
sqlcmd
Está en
C:\Program Files\Microsoft SQL Server\100\Tools\Binn
Las mayúsculas y minúsculas son importantes (curioso en Windows)
sqlcmd -S [nombre instancia servidor] -d [nombre bd] -i [fichero a ejecutar]
ejemplo
sqlcmd -S localhost\SQLExpress -d PruebaBD1 -i creacion_tablas.sql
21/2/10
Metadatos en sql server
Nombres de tablas en una base de datos
Nombre de restricciones forenign key
Nombres de Primary keys
Nombres de Campos de una tabla
SELECT name FROM SYSOBJECTS WHERE XTYPE='U';
Nombre de restricciones forenign key
SELECT * FROM SYSOBJECTS WHERE XTYPE='F';
Nombres de Primary keys
SELECT * FROM SYSOBJECTS WHERE XTYPE='PK';
Nombres de Campos de una tabla
Select name from syscolumns where id=object_id('tabla');
16/2/10
Compilación dll c# desde línea de comandos
csc /t:library /out:tiendalib.dll TiendaLib\TiendaLibBD.cs Tiendalib\
directorions\directorio.cs /lib:Utils\bin\Debug /reference:utils.dll
/t: <-- tarjet library = dll
/out: fichero de salida
lista de ficheros fuente
/lib: lista de directorios de donde cojer las dll
/reference: lista de ficheros dll referenciados
22/12/09
Oracle: Tablas que dependen de una dada
select CC.TABLE_NAME TablaQueReferencia,CC.COLUMN_NAME CampoDeEnlace,CC.POSITION PosicionDelCampo,C.CONSTRAINT_NAME NombreDelConstraint from all_constraints c
left join all_cons_columns cc
on c.constraint_name like cc.constraint_name
where c.constraint_type like 'R' -- Referencia
AND R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE
CONSTRAINT_TYPE LIKE 'P' -- Clave primaria
AND TABLE_NAME LIKE 'SERVIDORDAT')-- Nombre de la tabla a buscar sus dependientes
AND C.OWNER LIKE 'DESAR' AND CC.OWNER = 'DESAR'-- Nombre del esquema si hay varios
order by 1,2,3;
Hay que cambiar al nombre de la tabla y borrar lo del esquema si no hace falta.
Fundamental para poder borrar una tabla y saber qué otras tablas tienen referencias a ella.
Palabras clave (para búsqueda)
Oracle foreing key drop table clave foranea clave externa borrar tabla dependientes constraint constraints
31/7/09
Crear campo de tabla padre
Permite mostrar valores de nombre en tablas que solo almacenan el Id.
dsOracle.EQUIPODAT.Columns.Add("NombMotivoBaja", typeof(string), "Parent(FK_Equipodat_Motivo_Baja).nombre");
dsOracle == El dataset
EQUIPODAT == La tabla.
importante el: Parent(la relación).el_campo
dsOracle.EQUIPODAT.Columns.Add("NombMotivoBaja", typeof(string), "Parent(FK_Equipodat_Motivo_Baja).nombre");
dsOracle == El dataset
EQUIPODAT == La tabla.
importante el: Parent(la relación).el_campo
3/7/09
DataBinding con DateTimePicker
Un coñazo. Además no había encontrada nada en Internet que me funcionase.
La parte de código maneja el evento del parse y el format había que ponerlo en alguna clase común.
Hay que crear una variable en la clase para almacenar el binding y poder referenciarlo desde el FormClosing.
En el constructor. Yo lo paso a un “InicializarComponentes()”
El código de los eventos es:
Por último al final del “FormClosing” hay que eliminar el Binding porque si no se ejecutan los eventos pese a que el formulario esté cerrado.
La parte de código maneja el evento del parse y el format había que ponerlo en alguna clase común.
Hay que crear una variable en la clase para almacenar el binding y poder referenciarlo desde el FormClosing.
Binding BindingFIni;
En el constructor. Yo lo paso a un “InicializarComponentes()”
private void InicializarComponentes() {
BindingFIni = new Binding("Value", Program.dm.OrganoBindingSource, Program.dm.dsOracle.ORGANO.FINIColumn.ColumnName);
BindingFIni.Format += new ConvertEventHandler(BindingFIni_Format);
BindingFIni.Parse += new ConvertEventHandler(BindingFIni_Parse);
this.dtpFIni.DataBindings.Add(BindingFIni);
this.dtpFIni.Value = DateTime.Today;// Sin estas 2 líneas no funciona, lo que no se es porqué.
BindingFIni.WriteValue();// Línea necearia
// Ojo: Tambien es neceario incluir líneas en el FormClosing
}
El código de los eventos es:
void BindingFIni_Parse(object sender, ConvertEventArgs e) {//Se llama al grabar
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
if (dtp != null && !dtp.Checked) {
e.Value = DBNull.Value;
}
}
void BindingFIni_Format(object sender, ConvertEventArgs e) {// Se llama al leer
if (e.Value is System.DBNull) {
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
e.Value = DateTime.Today;
dtp.Checked = false;
}
}
Por último al final del “FormClosing” hay que eliminar el Binding porque si no se ejecutan los eventos pese a que el formulario esté cerrado.
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
//Aquí las comprovaciones necesarias
if (!e.Cancel) {
// Si no se hace esto sigue ejecutando el format aunque este formulario esté cerrado.
this.dtpFIni.DataBindings.Remove(this.BindingFIni);
}
}
11/6/09
.net .WinForms. Formulario Edición sencillo.
Tiene validación y controla si se han producido cambios para salir.
Atención a que los "EndEdit" son del BindingSource (por lo que actualiza en todos los sitios que se muestra la fila) y el
para comprobar si se han realizado cambios (el R.rowstate no se actualiza hasta que se ha hecho el "EndEdit" momento en el que no se podrían cancelar los cambios)
Para llamar al formulario según sea Creación o modificación.
Formulario en sí
Grabación
Atención a que los "EndEdit" son del BindingSource (por lo que actualiza en todos los sitios que se muestra la fila) y el
r.HasVersion(DataRowVersion.Proposed))para comprobar si se han realizado cambios (el R.rowstate no se actualiza hasta que se ha hecho el "EndEdit" momento en el que no se podrían cancelar los cambios)
Para llamar al formulario según sea Creación o modificación.
internal static void RolCrear() {
dm.rolBindingSource.AddNew();
dm.RolActual.CODIGO = -1;
(new Rol.FE()).ShowDialog();
}
internal static void RolModificar() {
(new Rol.FE()).ShowDialog();
}
Formulario en sí
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace InventarioDHCP.Rol {
public partial class FE : Form {
public FE() {
InitializeComponent();
InicializarComponentes();
}
private void InicializarComponentes() {
this.tbNombre.DataBindings.Add("Text", Program.dm.rolBindingSource, Program.dm.dsOracle.ESPECIALIDAD.NOMBREColumn.ColumnName);
}
private void btnSalir_Click(object sender, EventArgs e) {
this.Close();
}
private void btnGrabar_Click(object sender, EventArgs e) {
this.GrabarYSalir();
}
private void GrabarYSalir() {
if (this.Grabar()) {
this.Close();
}
}
private bool Grabar() {// Devuelve true si fue capaz de grabar
bool result = false;
if (this.EsValido()) {
Program.dm.rolBindingSource.EndEdit();
Program.dm.RolGrabar(Program.dm.RolActual, null);
result = true;
}
return result;
}
private bool EsValido() {
bool result = true;
this.errorProvider1.Clear();
if (this.tbNombre.Text.Equals("")) {
result = false;
this.errorProvider1.SetError(this.tbNombre, "Se ha de indicar un nombre");
}
return result;
}
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
DSOracle.ROLRow r = Program.dm.RolActual;
if (r.HasVersion(DataRowVersion.Proposed)) {// Si no ha cambiado no hacer nada
DialogResult dr = MessageBox.Show("¿Desea grabar los cambios?", "Atención:",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch (dr) {
case DialogResult.Yes: {
if (!this.Grabar()) {//Si no es capaz de grabar que no salga del formulario
e.Cancel = true;
}
break;
}
case DialogResult.No: {// Si no quiere grabar, cancelar la edición
Program.dm.rolBindingSource.CancelEdit();
break;
}
case DialogResult.Cancel: {// Si cancela no hacer nada pero tampoco salir del formulario
e.Cancel = true;
break;
}
default: {
throw new Exception("Respuesta no contemplada");
}
}
}
}
}
}
Grabación
public void RolGrabar(DSOracle.ROLRow r, OracleTransaction Trans) {
// Atención si se nos produce un error de compilación en las lineas siguientes hay que ir a la definición de Adapter y cambiarlo por public.
// Esto pasará cada vez que cambiemos algo en DSOracle.
this.rolTableAdapter.Adapter.InsertCommand.Transaction
= this.rolTableAdapter.Adapter.UpdateCommand.Transaction
= this.rolTableAdapter.Adapter.DeleteCommand.Transaction
= Trans;
if (r.RowState == DataRowState.Added) {
r.CODIGO = Util.OracleGetSequence(conOracle, "Rol_SEQ", Trans);
}
rolTableAdapter.Update(r);
}
20/4/09
Grids en asp.net
En el pageload
Al pulsar los botones que hemos añadido al grid se ejecuta el “RowCommand”.
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
// el e tiene:
//e.CommandArgument : La posicion en la que se ha pulsado el botón
//e.CommandName : El nombre del comando ”Lo hemos dado al crear el botón”
//e.CommandSource
int position = Convert.ToInt32(e.CommandArgument);
DataKey dk = this.GridView1.DataKeys[position];
decimal ServidorId = Convert.ToDecimal(dk.Value);// Si es una clave con varios campos dk.Values[X]
switch (e.CommandName) {
case “AnadirAGenerarDat”: {
//Acción con el botón correspondiente
break;
}
case “VerEquiposServidor”: {
//Acción con el botón correspondiente
break;
}
}
}
if (!IsPostBack) {
PrepararGrid();
}
private void PrepararGrid() {
this.GridView1.DataKeyNames = { "Codigo" };//lista de campos que forman la clave primaria
this.SqlDataSource.SelectCommand = “Select Codigo, nombre from tabla”;// Consulta para rellenar el grid
//Añadir las columnas y botones
UtilWeb.AnadirColumnaText(this.GridView1, "nombre", "NOMBRE");
UtilWeb.AnadirColumnaBoton(this.GridView1, “AnadirAGenerarDat”, "Generar Fichero Dat");
UtilWeb.AnadirColumnaBoton(this.GridView1, “VerEquiposServidor”, "Ver Equipos");
}
public static void AnadirColumnaBoton(GridView gv, string Comando, string TextoBoton) {
ButtonField btnf;
btnf = new ButtonField();
btnf.ButtonType = ButtonType.Button;
btnf.CommandName = Comando;
btnf.HeaderText = "";
btnf.Text = TextoBoton;
gv.Columns.Add(btnf);
}
public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera, bool visible) {
BoundField bf;
bf = new BoundField();
bf.DataField = Campo;
bf.HeaderText = Cabecera;
bf.ReadOnly = true;
bf.Visible = visible;
gv.Columns.Add(bf);
}
public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera) {
AnadirColumnaText(gv, Campo, Cabecera, true);
}
Al pulsar los botones que hemos añadido al grid se ejecuta el “RowCommand”.
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
// el e tiene:
//e.CommandArgument : La posicion en la que se ha pulsado el botón
//e.CommandName : El nombre del comando ”Lo hemos dado al crear el botón”
//e.CommandSource
int position = Convert.ToInt32(e.CommandArgument);
DataKey dk = this.GridView1.DataKeys[position];
decimal ServidorId = Convert.ToDecimal(dk.Value);// Si es una clave con varios campos dk.Values[X]
switch (e.CommandName) {
case “AnadirAGenerarDat”: {
//Acción con el botón correspondiente
break;
}
case “VerEquiposServidor”: {
//Acción con el botón correspondiente
break;
}
}
}
19/2/09
Manejo VirtualBox
Utilidades para arrancar la máquina sin hacerlo interactivamente.
Arrancar máquina virtual desde línea de comandos:
VBoxManage startvm "NombreMaquina"
Pausar una máquina desde línea de comandos:
VBoxManage controlvm "NombreMaquina" savestate
Copiar una máquina virtual (copia el disco duro. La máquina virtual hay que crearla y asignarle el nuevo disco duro creado):
VBoxManage clonevdi Fuente.vdi Destino.vdi
12/2/09
ASP.NET: Paso de Rows a Textboxes y viceversa
En Web no hay databinding salvo en grids. Hacen falta estas cosas para pasar los datos de la fila al formulario de de vuelta a la tabla en los formularios de edición
public static void SetTextOrNull(TextBox textBox, DataRow r, DataColumn dataColumn) {
if (textBox.Text.Equals("")) {
r[dataColumn] = System.Convert.DBNull;
} else {
r[dataColumn] = textBox.Text;
}
}
public static void GetTextOrNull(TextBox tb, DataRow r, DataColumn dataColumn) {
if (r[dataColumn].Equals(System.Convert.DBNull)) {
tb.Text = "";
} else {
tb.Text = r[dataColumn].ToString();
}
}
Hay que pasarles el textbox la Row y el nombre de la columna es una variable en la tabla (gracias a que la genera como pública).
27/11/08
URL para iniciar asistencia remota
Ojo puede fallar por temas de puertos abiertos.
"hcp://CN=Microsoft%20Corporation,L=Redmond,S=Washington,C=US/Remote%20Assistance/Escalation/Unsolicited/unsolicitedrcui.htm"
"hcp://CN=Microsoft%20Corporation,L=Redmond,S=Washington,C=US/Remote%20Assistance/Escalation/Unsolicited/unsolicitedrcui.htm"
30/9/08
Añadir valor nulo en un comboBox asp.net (dropdownlist)
Hay que asignar a true la propiedad AppendDataBoundsItems.
this.comboLocalidad.AppendDataBoundsItems = true;
this.comboLocalidad.Items.Add(new ListItem("Sin asignar", "0"));
El valor 0 tendrá que ser tratado al grabar como nulo.
this.comboLocalidad.AppendDataBoundsItems = true;
this.comboLocalidad.Items.Add(new ListItem("Sin asignar", "0"));
El valor 0 tendrá que ser tratado al grabar como nulo.
19/9/08
Curioso juego de programación
http://www.gameroo.nl/games/light-bot
palabras clave:
juego programación interesante aprendizaje chorrada
palabras clave:
juego programación interesante aprendizaje chorrada
Suscribirse a:
Comentarios (Atom)