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

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.

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 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

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).

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.

19/9/08

Curioso juego de programación

http://www.gameroo.nl/games/light-bot

palabras clave:
juego programación interesante aprendizaje chorrada

16/9/08

Para modificar o eliminar un registro de un GridView de asp. net.

Palabras clave:
GridView, Posición, Posicionar, modificar, eliminar, RowCommand, DataKeys, Grid, Rejilla.

// e.CommandArgument.ToString(). Nos devuelve una cadena con la posición en el grid en la que se ha pulsado el botón.
// Para obtener la clave primaria de la fila pulsada hemos de definir en el GridView en su propiedad “DataKeyNames” los nombres de los campos que forman la clave primaria a mano antes de empezar.
DataKey dk = this.GridView1.DataKeys[Int32.Parse(e.CommandArgument.ToString())];
// El dk obtiene la lista de valores para acceder al segundo se pone el [1]
this.Title = dk.Values[1].ToString();

Una vez obtenida la clave primaria ya se puede obtener el objeto a modificar.

14/7/08

Tamaño de la barra de windows

La barra mide 22 puntos.
si a 768 ( de 1024 x 768) le restamos 22 tenemos que para aplicaciones podemos tener:

746 puntos de alto.

19/6/08

Creación de tabla en oracle


CREATE table "S" (
"A" NUMBER(5,5) NOT NULL,
"C" VARCHAR2(4000),
constraint "S_PK" primary key ("A")
)
/

CREATE sequence "S_SEQ"
/

CREATE trigger "BI_S"
before insert on "S"
for each row
begin
select "S_SEQ".nextval into :NEW.A from dual;
end;
/

ALTER TABLE "S" ADD CONSTRAINT "S_FK"
FOREIGN KEY ("C")
REFERENCES "TABLA1" ("ID")

/

23/4/08

Netbeans jsf oracle + Primera inserción que funciona

Necesita un messageGroup1

int id = 31;
String nomb = "Treinta y uno";
Connection con = null;
try {
InitialContext ic = new InitialContext();
//en esta parte es donde ponemos el Nombre
//de JNDI para que traiga el datasource
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/HR_Oracle");
con = ds.getConnection();
Statement st = con.createStatement();
try{
String com = "insert into TABLA1(id,nomb) values ("
+ Integer.toString(id)
+ ",'"
+ nomb
+ "')";
info(com);
int executeUpdate = st.executeUpdate(com);
info(Integer.toString(executeUpdate));
}catch(SQLException ex){
error(ex.getMessage());
}
//el resultSet es el encargado de traer los datos de la consulta
ResultSet rs = st.executeQuery("select * from TABLA1");
while (rs.next()) {
info(" " + rs.getString(1) + " " + rs.getString(2));
}
} catch (SQLException ex) {
error(ex.getMessage());
} catch (Exception exx) {
error(exx.getMessage());
}

4/3/08

Fila actual de un BindingSource

Actualización: Parece que esto funcionaría y compacta el código.

return (this.BaseDeDatosBS.Current as DataRowView).Row as DS.BaseDeDatosRow;
// Si no hay Current devolvería un null.


Sirve para acceder al elemento actual de un binding source con el tipo de fila adecuado.

public DS.JuzgadoRow JuzgadoActual {
get {
DS.JuzgadoRow result = null;
if (this.JuzgadoBs.Current != null) {
DataRowView drw = this.JuzgadoBs.Current as DataRowView;
result = drw.Row as DS.JuzgadoRow;
}
return result;
}
}

28/11/07

Text de solo números

Debería ser con change. De hecho falla si le pegamos letras pero es lo que hay.
Se permiten números y carateres de control (si no se permiten los caracteres de control el borrar falla)


private void textAno_KeyPress(object sender, KeyPressEventArgs e) {
e.Handled = !(Char.IsNumber(e.KeyChar) || Char.IsControl(e.KeyChar));
}


21/11/07

Campo calculado en un DataTable de un DataSet .net

Program.dm.ds.Proc.Columns.Add("TipoProcNomb", typeof(string), "Parent(FK_TipoProc_Proc).nomb");

(habría que explicarlo más)

17/10/07

Databinding ComboBox C#


ComboBox.DataSource = Program.dm.TipoProcBindingSource; //BindingSource a mostrar
ComboBox.DisplayMember = "nomb"; // Campo nombre
ComboBox.ValueMember = "id"; // Campo valor
ComboBox.DataBindings.Add( // enlace con el campo donde se guarda el valor
new Binding("SelectedValue", // La propiedad de SelectedValue ( no value)
Program.dm.procBindingSource, // Bindingsource de la tabla en la que grabamos el valor
"idTipoProc" // nombre del campo en el que guardamos el valor
));

4/10/07

Comprobar permisos al ejecutar aplicación .net

Sacado de campusMVP

private static bool CheckFullTrust()
{
try
{
// Demandar Full Trust
new PermissionSet(PermissionState.Unrestricted).Demand();
return true;
}
catch (SecurityException)
{
try
{
// No estamos en Full Trust, se lo contamos al usuario
MessageBox.Show("La aplicación necesita Full Trust");
}
catch (SecurityException)
{
// La aplicación no tiene permisos mostrar mensajes... :(
//Logeamos lo ocurrido
}
}
return false;
}