¿Cómo cambiar el color de fondo de un Formulario que es contenedor de formularios secundarios MDI? C# .Net

Cuando creamos nuestro sistema en Windows form y el formulario principal lo convertimos en MDI, la mayoría de veces queremos cambiar el color gris por defecto a otro, pero nos damos cuenta que al cambiar el color no cambia el gris oscuro del MDI, esto es porque al crear el formulario MDI en realidad se está incorporando otro control de tipo MdiClient.

A continuación te muestro como podemos cambiar el color del MdiCliente:


//Haz esto en el evento Load de tu formulario MDI

 MdiClient oMDI;

//recorremos todos los controles hijos del formulario
foreach (Control ctl in this.Controls)
{
        try
        {
           // Intentamos castear el objeto MdiClient
           oMDI = (MdiClient)ctl;

          // Cuando sea casteado con éxito, podremos cambiar el color así
          oMDI.BackColor = Color.White;
        }
        catch (InvalidCastException exc)
        {
          // No hacemos nada cuando el control no sea tupo MdiClient
        }
}

¿Cómo aplicar un update a varias filas por medio de EntityFramework.Extended? C# .Net

Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.

Aquí te muestro como hacerlo sin utilizar una librería externa, es decir, modificar varios objetos sin EntityFramework.Extended.

Igual te recuerdo que utilizar EntityFramework.Extended como Entity Framework nativo no las recomiendo cuando vas a modificar más de mil datos, mejor utiliza un procedimiento almacenado.

La ventaja que veo al utilizar EntityFramework.Extended es un aspecto de sintaxis ya que de esta manera evitamos hacer el recorrido de los elementos e ir modificando objeto por objeto, con esta librería es de una forma más sencilla para el programador.

Para el siguiente ejemplo,  supongamos que tenemos una tabla llamada Persona, que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:


using(MiEntity db= new MiEntity()){

  //realizamos la modificación sin foreach, ni SaveChanges()
  db.Persona.Where(d => d.Nombre=="Juan")
 .Update(x => new Persona() { Edad = 10 });

}

De esta manera no necesitamos el método SaveChanges(), ya que Update lo hace internamente.

¿Cómo detectar si un formulario ya ha sido abierto en Windows Form? C# .Net

Te mostrare como saber si un formulario de nuestra aplicación ya ha sido abierto.

Algunas veces tenemos la necesidad de que un formulario no sea abierto más de una vez, ya sea por requerimiento o por ser una modulo que deseamos que no se abra miles de veces.

La siguiente función recibe una cadena con el nombre de tu formulario como tal, si tu formulario se llama FrmUsuario entonces recibirá “FrmUsuario”:


public class FormUtils{

//función
        public static bool detectarFormularioAbierto(string formulario)
        {
            bool abierto = false;

            if (Application.OpenForms[formulario] != null)
            {
                abierto = true;
            }
            return abierto;
        }
}

Y seria utilizada de la siguiente manera:


bool estaAbierto=FormUtils.detectarFormularioAbierto("FrmUsuario");

¿Cómo obtener el valor de una celda de una fila seleccionada en un DataGridView de Windows Form? C# .Net

Para obtener el valor de una celda de una fila seleccionada a continuación te muestro una función que te regresara el valor como cadena, ese valor tu puedes parsearlo a el tipo de dato que necesites ya sea un entero, decimal etc.

La función recibe tu DataGridView como parámetro y el número de la posición de la celda deseada.

Recuerda que las celdas del DatGridView comienzan con el número 0, ya que se manejan igual que un arreglo.


public class DataGridViewUtils
{
 public static string GetValorCelda(DataGridView dgv, int num)
        {
            string valor = "";

            valor = dgv.Rows[dgv.CurrentRow.Index].Cells[num].Value.ToString();

            return valor;
        }
}

Para utilizar la función sería de la siguiente manera:


//Mandamos nuestro DataGridView y la posición deseada
string valor= DataGridViewUtils.GetValorCelda(dgv,0);

¿Cómo quitar la función de ordenamiento en un DataGridView de Windows Form? C# .Net

Para eliminar la funcionalidad de ordenamiento en un DataGridView, a continuación te muestro cómo es posible lograrlo:


 //creamos un datagridview para el ejemplo, pero en tu caso es el DataGridView que ya creaste en tu formulario, el cual ya tiene columnas.
 DataGridView dgv= new DataGridView();

 //recorremos todas sus columnas
 foreach (DataGridViewColumn Col in dgv.Columns)
 {
     Col.SortMode = DataGridViewColumnSortMode.NotSortable;
 }

¿Cómo centrar un control en Windows form C# .Net?

Para centrar un control cualquiera (Textbox, ComboBox, DataGridView ETC) que se encuentra en otro control por ejemplo un panel o un form, vamos a recurrir a un poco de matemáticas.

A continuación muestro con una función como es posible centrar un control respecto a su padre.


 public class ControlUtils
    {
        public static void centraX(Control padre, Control hijo)
        {
            int x = 0;

            //un poco de matematicas, restando los anchos y dividiendo entre 2
            x = (padre.Width/2)-(hijo.Width/2);

            //asignamos la nueva ubicación
            hijo.Location = new System.Drawing.Point(x,hijo.Location.Y);
        }
    }

Recuerda que todos los controles de Windows form heredan de la clase Control.

Para utilizarla sería de la siguiente manera:


//Suponiendo que es un textbox que se encuentra en un panel
ControlUtils.centraX(txtTextBox,panelContenedor);

¿Cómo utilizar transacciones con Entity Framework? C# .Net

Las transacciones son útiles cuando hablamos de base de datos y debemos hacer muchas consultas en conjunto, ya que nos permiten realizar un retroceso en la manipulación de datos si una de las consultas del conjunto falla.

Con Entity Framework es posible realizar transacciones, y no solo eso, sino que podemos tener el poder de realizar otras funciones distintas a manipulación de datos y decidir si fallan estas otras funciones aplicar un rollback.

A continuación te mostrare con un pequeño ejemplo.

Teniendo nuestro Entity Framework con el nombre MiEntity:


//creamos nuestro contexto
 using (var db = new MiEntity())
{
                //creamos el ámbito de la transacción
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        //una consulta
                        tabla oTabla = new tabla();
                        oTabla.campo="pato";

			//agregamos el elemento
                        db.tabla.Add(oTabla);

			//otra consulta
                        tabla2 oTabla2 = new tabla2();
                        oTabla2.campo="pato";

			//agregamos otro elemento
                        db.tabla2.Add(oTabla2);

			//guardamos en la base de datos
                        db.SaveChanges();

                        //hacemos algo extra a manipulación de datos
			//como enviar un mail, suponiendo que regresa true si es exitoso
                        if (!EnviaUnMail())
                        {
                            //hacemos rollback si fallo el envio del mail
                            dbContextTransaction.Rollback();
                        }

                        //Hacemos commit de todos los datos
                        dbContextTransaction.Commit();

                    }
                    catch (Exception ex)
                    {
                        //hacemos rollback si hay excepción
                        dbContextTransaction.Rollback();

                    }
                }
} 

¿Cómo llenar los valores de un combobox con Entity framework en Windows Form .Net? C#

Para llenar de elementos un combobox existe diversas formas de hacerlo, y esta vez te mostrare como hacerlo a partir de una tabla mapeada en Entity Framework.

En el siguiente ejemplo, ya existiendo un Entity Framework en nuestro proyecto, hacemos la consulta deseada a la tabla con los filtros y ordenamiento deseado, y seleccionamos que campo será mostrado y que campo será el valor, llenamos nuestro combobox llamado cboCatalogo:


 using (MiEntity db = new MiEntity()) {

                //realizamos la consulta aplicando filtros y ordenamientos
                //y convertimos a lista, esto ultimo es Importante
                cboCatalogo.DataSource = db.tabla.Where(d => d.algo == 1).OrderBy(d=>d.nombre).ToList();

                //campo que vera el usuario
                cboCatalogo.DisplayMember = "nombre"; 

                //campo que es el valor real
                cboCatalogo.ValueMember = "id";
 }

De esta manera tenemos más control con lo que deseamos mostrar, teniendo el poder de filtrar u ordenar nuestra consulta.

¿Cómo verificar automáticamente si existe la sesión web en un desarrollo web? C# .Net

En este video describo cómo es posible estar verificando si el usuario sigue teniendo la sesión en un sistema web.

Muchas veces nuestra sesión ha terminado por inactividad, y esta logística te servirá para tomar una decisión, si mandar al usuario a la pantalla de autentificación o simplemente mostrarle un mensaje de que su sesión expiro.

Ahora ya podrás ser capaz de detectar si la sesión ha terminado sin necesidad de que el usuario se entere hasta que de clic en algún elemento de tu pagina.

Descargar ejemplo