¿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 realizar un Order by o un Group by a un tipo de dato Text en SQL Server?

Como sabemos un tipo de dato Text es un tipo de datos que no se le puede aplicar un ordenamiento en SQL Server. Si intentamos hacerlo recibiremos un mensaje como este:

No se pueden comparar ni ordenar los tipos de datos text, ntext e image, excepto cuando se utiliza el operador IS NULL o LIKE.

Pero hay una forma con la cual podemos lograrlo, y es convertirlo en un tipo de dato ordenable, en este caso en un tipo varchar, como a continuación muestro:


-- Ordenamiento
select * from tabla
order by CAST(campoText AS varchar(max))

-- Agrupamiento
select CAST(campoText AS varchar(max)) from tabla
group by CAST(campoText AS varchar(max))

De esta manera podemos ordenar o agrupar un tipo de dato Text en SQL Server

¿Cómo hacer que todas las cadenas en todos los ViewModel en un proyecto en MVC .Net se les aplique Trim o ToUpper? DefaultModelBinder

Cuando se trabaja en un equipo de desarrollo que sobre pasa los 3 programadores muchas veces se debe obligar a que se realicen tareas básicas como recortar los espacios en las cadenas por medio de Trim, o quizá si existe un requerimiento del cliente de que todas las cadenas estén en mayúsculas realizar un ToUpper o por lo contrario un ToLower, bueno, cualquier función sobre algún tipo de dato en todos nuestros modelos de nuestra aplicación.

Para asegurarnos de que siempre sean ejecutadas este tipo de operaciones existe en MVC .Net algo llamado Binder o ModelBinder el cual trabaja como cubierta de la información y puede transformarla a lo que deseemos, validar o realizar una operación.

A continuación incluyo una clase la cual hará que todas las cadenas que existan en nuestros View Model se les aplique una función Trim y una función ToUpper, así evitamos ponerlas en todos los controles, haciendo que esto ya sea un proceso por defecto en toda la aplicación.


namespace Sistema.Models.Binders
{
    public class TrimToUpperBinder : DefaultModelBinder
    {

        protected override void SetProperty(ControllerContext controllerContext,
         ModelBindingContext bindingContext,
         System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
        {
             //Solo modificaremos los string, por lo cual detectamos el tipo de dato
            if (propertyDescriptor.PropertyType == typeof(string))
            {
                var stringValue = (string)value;
                if (!string.IsNullOrEmpty(stringValue))
                {
                    stringValue = stringValue.Trim(); //trimeamos
                    stringValue = stringValue.ToUpper(); //mayuscula
                }

                value = stringValue;
            }

            base.SetProperty(controllerContext, bindingContext,
                                propertyDescriptor, value);
        }
    }
}

Y para que sea ejecutado en toda la aplicación debemos inicializar nuestra clase en el archivo Global.asax en el método Application_Start() de la siguiente manera:


 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Aquí remplazamos el binder por defecto con el nuestro
            ModelBinders.Binders.DefaultBinder = new Sistema.Models.Binders.TrimToUpperBinder();
        }

¿Cómo convertir archivos XSD a clases de C# .Net? cfdi 3.3 SAT

En este video describo como se puede generar las clases a partir de un archivo XSD.

También explico cómo convertir las clases en archivos XSD que tienen dependencia de otros archivos XSD.

Para ello aprovecho para generar las clases necesarias para crear el archivo XML que sirve para la facturación electrónica 3.3 del SAT en México.

Utilizaremos Visual Studio Command Prompt.

Si desean que haga un curso completo para la facturación electrónica, dime en los comentarios.

¿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

¿Cómo copiar el contenido al portapapeles de un elemento HTML al dar clic en él?

Para que el contenido que tiene un elemento sea copiado automáticamente al portapapeles del usuario, anexo la siguiente función en javascript ayudándome de los selectores de jquery.

Cada paso esta comentado, para en caso de utilizarla con un distinto elemento puedas modificarla sin dificultad.

En el ejemplo realizo la copia del contenido html que existe dentro de un elemento td de una tabla.

HTML


<table>
      <tr>
           <td onclick="Copiar(this)">Hola soy un texto que se copia al darle clic</td>
           <td onclick="Copiar(this)">Hola yo soy otro texto que se copia al darle clic</td>
      </tr>
</table>


JAVASCRIPT


 function Copiar(element) {
        //creamos un input que nos ayudara a guardar el texto temporalmente
        var $temp = $("<input>");
        //lo agregamos a nuestro body
        $("body").append($temp);
        //agregamos en el atributo value del input el contenido html encontrado
        //en el td que se dio click
        //y seleccionamos el input temporal
        $temp.val($(element).html()).select();
        //ejecutamos la funcion de copiado
        document.execCommand("copy");
        //eliminamos el input temporal
        $temp.remove();
    }

¿Cómo convertir archivo PDF a Docx en C# .Net? – Spire.Pdf vs SautinSoft.PdfFocus

Te muestro como convertir un archivo PDF a un archivo Docx con dos librerías que tienen precio pero hacen su trabajo.

Código del ejemplo:


  class Program
    {
        //ORIGEN PDF
        static string pathPDF = @"C:\AlgunaRuta\archivo.pdf";

        //DESTINOS ARCHIVO DOCX
        static string pathDoc1 = @"C:\AlgunaRuta\archivo-spire.docx";
        static string pathDoc2 = @"C:\AlgunaRuta\archivo-sautin.docx";

        static void Main(string[] args)
        {
            //llamamos para convertir el pdf con spire
            UsandoSpirePdf();

            //llamamos para convertir el pdf con sautinsoft
            UsandoSautin();

        }

        public static void UsandoSpirePdf()
        {

            PdfDocument pdf = new PdfDocument();
            //cargamos el pdf
            pdf.LoadFromFile(pathPDF);

            //guardamos el docx
            pdf.SaveToFile(pathDoc1, FileFormat.DOCX);

            //abrimos el archivo
            System.Diagnostics.Process.Start(pathDoc1);

        }

        public static void UsandoSautin()
        {

            SautinSoft.PdfFocus oPdfFocus = new SautinSoft.PdfFocus();

            //cargamos el pdf
            oPdfFocus.OpenPdf(pathPDF);

            //si se tiene mas de 1 pagina
            if (oPdfFocus.PageCount > 0)
            {
                //asignamos el tipo de documento al que convertiremos
                oPdfFocus.WordOptions.Format = SautinSoft.PdfFocus.CWordOptions.eWordDocument.Docx;

                //guardamos el dox
                int resultado = oPdfFocus.ToWord(pathDoc2);

                if (resultado == 0)
                {
                    //abrimos el documento
                    System.Diagnostics.Process.Start(pathDoc2);
                }
            }
        }
    }

Spire.Pdf: https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html

SautinSoft.PdfFocus: http://www.sautinsoft.com/products/pdf-focus/