RenderTransform excede tamaño del contenedor (Render Transforma exceed container size)

Deja un comentario

Cuando estaba utilizando la clase  ScaleTransform para realizar un zoom sobre un control tenia el problema que el control al que hacia zoom sobresalia al tamaño del contenedor.

Ejemplo:

2018-05-26_23-55-28

2018-05-26_23-57-13

Realizando multiples investigaciones encontre la solucion a este problema :

Utilizar un grid como contenedor del control al que se le hara el zoom , declarando una fila y una columna con Height y Width en auto.

Codigo de ejemplo XAML:

2018-05-27_00-16-48

CodeBehind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace zoom_user_control
{
    ///

    /// Interaction logic for UserControlToZoom.xaml
    /// 

    public partial class UserControlToZoom : UserControl
    {
        public UserControlToZoom()
        {
            InitializeComponent();
        }

        private void UserControl_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            var delta = (e.Delta / 2000d).ToMultipleOf(0.05d);
            this.MediaElementZoom = Math.Round(this.MediaElementZoom + delta, 2);
        }

        ///

        /// Gets or sets the media element zoom.
        /// 

        ///

        /// Gets or sets the media element zoom.
        /// 

        public double MediaElementZoom
        {
            get
            {
                var m = this.lbl;
                if (m == null) return 1d;

                var transform = m.RenderTransform as ScaleTransform;
                if (transform == null)
                    return 1d;

                return transform.ScaleX == null ? 1d : transform.ScaleX;
            }
            set
            {
                var m = this.lbl;
                if (m == null) return;

                var transform = m.RenderTransform as ScaleTransform;
                if (transform == null)
                {
                    transform = new ScaleTransform(1, 1);

                    m.RenderTransformOrigin = new Point(0.5, 0.5);
                    m.RenderTransform = transform;
                }

                transform.ScaleX = value;
                transform.ScaleY = value;

                if (transform.ScaleX  5)
                {
                    transform.ScaleX = 5;
                    transform.ScaleY = 5;
                }
            }
        }
    }
}

Extentions:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace zoom_user_control
{
    public static class Extentions
    {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static double ToMultipleOf(this double value, double multiple)
        {
            var factor = Convert.ToInt32(value / multiple);
            return factor * multiple;
        }
    }
}

Si les sirvio , no olviden comentar 🙂

 

Link de Referencia

Leer hoja de Excel desde C# y Mostrarlos en DataGridView (Read excel file en view in DataGridView C#)

59 comentarios

Bueno, en esta ocacion les traigo una aplicacion la cual consiste en leer los datos de una hoja de excel y mostrarlos en un DataGridView.

Para este ejemplo , el diseño del formulario sera el siguiente:

grid

Ahora damos doble click en el boton buscar y pasaremos a crear el codigo correspondiente:

Importamos la libreria System.Data.OleDb a nuestro proyecto utilizando using System.Data.OleDb;

ahora creamos un metodo llamado LlenarGrid que reciba como parametro la ruta del archivo que vamos a abrir y la hoja que vamos a leer, estos deben ser de tipo string.

el codigo del metodo es el siguiente:


 private void LLenarGrid(string archivo,string hoja)
        {
            //declaramos las variables         
            OleDbConnection conexion = null;
            DataSet dataSet = null;
            OleDbDataAdapter dataAdapter = null;           
            string consultaHojaExcel = "Select * from [" + hoja + "$]";

            //esta cadena es para archivos excel 2007 y 2010
            string cadenaConexionArchivoExcel = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + archivo + "';Extended Properties=Excel 12.0;";
           
            //para archivos de 97-2003 usar la siguiente cadena
            //string cadenaConexionArchivoExcel = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + archivo + "';Extended Properties=Excel 8.0;";

            //Validamos que el usuario ingrese el nombre de la hoja del archivo de excel a leer
            if (string.IsNullOrEmpty(hoja))
            {
                MessageBox.Show("No hay una hoja para leer");
            }
            else
            {
                try
                {
                    //Si el usuario escribio el nombre de la hoja se procedera con la busqueda
                    conexion = new OleDbConnection(cadenaConexionArchivoExcel);//creamos la conexion con la hoja de excel
                    conexion.Open(); //abrimos la conexion
                    dataAdapter = new OleDbDataAdapter(consultaHojaExcel, conexion); //traemos los datos de la hoja y las guardamos en un dataSdapter
                    dataSet = new DataSet(); // creamos la instancia del objeto DataSet
                    dataAdapter.Fill(dataSet, hoja);//llenamos el dataset
                    dataGridView1.DataSource = dataSet.Tables[0]; //le asignamos al DataGridView el contenido del dataSet
                    conexion.Close();//cerramos la conexion
                    dataGridView1.AllowUserToAddRows = false;       //eliminamos la ultima fila del datagridview que se autoagrega
                }
                catch (Exception ex)
                {
                    //en caso de haber una excepcion que nos mande un mensaje de error
                    MessageBox.Show("Error, Verificar el archivo o el nombre de la hoja",ex.Message);
                }
            }
        }

Ahora el boton buscar tendra el siguiente codigo:

 private void button1_Click(object sender, EventArgs e)
        {
            //creamos un objeto OpenDialog que es un cuadro de dialogo para buscar archivos
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Archivos de Excel (*.xls;*.xlsx)|*.xls;*.xlsx"; //le indicamos el tipo de filtro en este caso que busque
            //solo los archivos excel

            dialog.Title = "Seleccione el archivo de Excel";//le damos un titulo a la ventana

            dialog.FileName = string.Empty;//inicializamos con vacio el nombre del archivo

            //si al seleccionar el archivo damos Ok
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //el nombre del archivo sera asignado al textbox
                txtArchivo.Text = dialog.FileName;
                hoja = txtHoja.Text; //la variable hoja tendra el valor del textbox donde colocamos el nombre de la hoja
                LLenarGrid(txtArchivo.Text,hoja); //se manda a llamar al metodo

                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //se ajustan las
                //columnas al ancho del DataGridview para que no quede espacio en blanco (opcional)
            }      
        }

Espero les sirva, si les sirvio no olviden comentar, cualquier duda estoy a sus ordenes.
Saludos.

Paginas de referencia en VB : http://blog.desarrolladoresmx.net/2012/10/04/importar-de-un-archivo-de-excel-a-un-datagridview/

Agregar librerias para trabajar con MySql en C#

4 comentarios

En este post explicare como agregar las librerias para poder trabajar desde C# con bases de datos realizadas en MySQL.

Primero necesitamos las librerías, podemos bajar el instalador desde la pagina oficial de MySql o desde mi servidor de archivos.

si quieren bajarlas desde mi servidor de archivos aqui les dejo el link para que las descarguen.

https://www.dropbox.com/s/5yp5cwssd3atw3l/Dlls%20MySQL.rar

una ves que se descarguen, descomprimir el archivo, abrimos un nuevo proyecto en visual studio 2010
en la parte derecha, en el explorador de soluciones damos click derecho en References, nos aparecera un menu en el cual seleccionaremos agregar referencia o add reference
y nos aparecera una pantalla donde seleccionaremos la dll a utilizar.

seleccionamos la pestaña browse o navegar y buscamos en el directorio donde se extrajeron las dlls y las seleccionamos y damos aceptar.

despues de realizar estos pasos podemos ver que ya estan agregadas las DLLS para trabajar con MySql.

imagen4

Espero les sirva este post.
cualquier duda o comentario estoy a sus ordenes.
no olviden comentar :).

Manejo de eventos en C# (EventArgs C# ,Events in C#)

3 comentarios

Bueno aqui les traigo un nuevo post sobre el manejo de eventos utilizando la clase base Event args.

Espero les sirva de algo como a mi me sirvio =).

Aqui les dejo un poco de teoria sobre este tema.

Un evento en C# es el modo que tiene una clase de proporcionar notificaciones a los clientes de la clase cuando ocurre algo digno de reseñar en un objeto. El uso más habitual para los eventos se produce en las interfaces gráficas; normalmente, las clases que representan controles de la interfaz disponen de eventos que se notifican cuando el usuario hace algo con el control (por ejemplo, hacer clic en un botón).

Los eventos, sin embargo, no sólo se utilizan para interfaces gráficas. Los eventos proporcionan un medio apropiado para que los objetos puedan señalizar cambios de estado que pueden resultar útiles para los clientes de ese objeto. Los eventos constituyen unidades importantes para crear clases que se pueden reutilizar en diferentes programas.

En ese post se describirá un ejemplo sencillo de como generar un evento así como pasar parámetros a un evento mediante la clase EventArgs.

EventArgs es la clase base para las clases que contienen datos de eventos. por esta razón cada vez que tengamos una clase  en la que queramos exponer eventos en sus argumentos, debemos heredarla.

Ejemplo:

en este ejemplo usare una aplicación de consola con una clase que ejecute un Timer, este a su vez estará ejecutando una acción cada determinado tiempo, así al ejecutarse el Timer llamaremos al evento y le pasaremos los argumentos para que estos puedan ser usados desde la clase donde es llamado.

Se crea una clase la cual contendrá las propiedades que se pasaran como parámetros del evento.

Clase donde se manda a disparar el evento :

Por ultimo solo tenemos que inicializar el timer y suscribirnos al evento

Espero les sirva este post =) cualquier duda y/o comentario estoy a sus ordenes =3 no olviden comentar , les adjunto el archivo con el codigo fuente

Link con el codigo fuente Aqui =)

Referencia:
http://geeks.ms/blogs/etomas/archive/2012/01/05/c-b-225-sico-eventos.aspx
http://unespacioparanet.appfuture.net/?p=268

The TimeSpan could not be parsed because at least one of the numeric components is out of range or contains too many digits

Deja un comentario

Es este post , publicare la solucion de un error con el que me tope manejando horas, el cual requeria en base a un cadena en formato HH:MM:SS obtener el total de minutos,

el problema fue que tenia una funcion que me traia ese dato solo llamando a la propiedad TotalMinutes de la clase TIMESPAN todo marchaba a la perfeccion, solo que al recibir una cadena en formato MM:SS (minutos,segundos) he ahi donde me marcaba el error.

 

les dejo la solucion al problema en el siguiente codigo fuente =).

string time = «[Cadena con el tiempo en formato HH:MM:SS o MM:SS]»;
int[] ssmmhh = { 0, 0, 0 }; //arreglo que simboliza que hay 0 horas 0 minutos 0 segundos
var hhmmss = time.Split(‘:’);  // la funcion split separa la cadena a partir del caracter que se indique
var reversed = hhmmss.Reverse(); // invierte la cadena
int i = 0;
reversed.ToList().ForEach(x => ssmmhh[i++] = int.Parse(x)); //asigna cada bloque de cadenas a una posicion del arreglo
var seconds = Math.Round((double)(new TimeSpan(ssmmhh[2], ssmmhh[1], ssmmhh[0])).TotalMinutes,2); // realiza las operaciones para obtener //el total de minutos y hace un redondeo de dos digitos

Espero les sirva este post. a mi me sirvio mucho =). les dejo el linq de referencia, donde encontre la solucion.

http://stackoverflow.com/questions/682039/how-do-i-convert-hhmmss-into-just-seconds-using-c-net