Ir al contenido principal

DataGridViewTextEditorColumn (II Parte)

Bien, continuando con el articulo.... la primera clase que veremos sera RepositoryTextEditor, este heredara de Component ya que no tendrá una UI que interactue con el usuario.
 
[ToolboxBitmap(typeof(System.Windows.Forms.TextBox))]
[DesignerSerializer(typeof(RepositoryButtonSerializer), typeof(CodeDomSerializer))]
public class RepositoryTextEditor : Component
{
    private string name;
    private bool allowWhiteSpace;
    private HorizontalAlignment textAlign;
    private CharacterCasing characterCasing;
    private TextEditor.MaskType maskType;
    private RepositoryButtonCollection buttons;
    private static readonly object buttonClick;
    internal System.Windows.Forms.DataGridView DataGridViewOwner { get; set; }

    public delegate void RepositoryButtonPressEventHandler(object sender, RepositoryButtonArgs args);
    public event RepositoryButtonPressEventHandler ButtonClick
    {
        add
        {
            base.Events.AddHandler(buttonClick, value);
        }
        remove
        {
            base.Events.RemoveHandler(buttonClick, value);
        }
    }

    static RepositoryTextEditor()
    {
        buttonClick = new object();
    }
    public RepositoryTextEditor()
    {
        this.allowWhiteSpace = true;
        this.characterCasing = CharacterCasing.Normal;
        this.textAlign = HorizontalAlignment.Left;
        this.maskType = TextEditor.MaskType.None;
        this.buttons = new RepositoryButtonCollection(this);
    }

    [DefaultValue(typeof(TextEditor.MaskType), "None")]
    public TextEditor.MaskType MaskType
    {
        get { return this.maskType; }
        set { this.maskType = value; }
    }
    [DefaultValue(typeof(HorizontalAlignment), "Left")]
    public HorizontalAlignment TextAlign
    {
        get { return this.textAlign; }
        set { this.textAlign = value; }
    }
    [DefaultValue(true)]
    public bool AllowWhiteSpace
    {
        get { return this.allowWhiteSpace; }
        set { this.allowWhiteSpace = value; }
    }
    [DefaultValue(typeof(CharacterCasing), "Normal")]
    public CharacterCasing CharacterCasing
    {
        get { return this.characterCasing; }
        set { this.characterCasing = value; }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public RepositoryButtonCollection Buttons
    {
        get
        {
            return this.buttons;
        }
    }
    [Browsable(false), DefaultValue("")]
    public string Name
    {
        get
        {
            if (this.Site != null)
                return this.Site.Name;
            return this.name;
        }
        set
        {
            if (value != null)
                this.name = value;
        }
    }

    internal void OnButtonClick(RepositoryButtonArgs args)
    {
        RepositoryButtonPressEventHandler handler = (RepositoryButtonPressEventHandler)base.Events[buttonClick];
        if (handler != null)
            handler.Invoke(this, args);
    }
    internal void InvalidateDataGridView()
    {
        if (this.DataGridViewOwner != null)
            this.DataGridViewOwner.Invalidate();
    }
}
 
No crean que me gusta la idea de mostrar mucho código, porque en muchas ocasiones no se logra entender nada... pero bien, el editor de esta columna sera mi control TextEditor y este componente le dirá al editor que propiedades deberá de cambiar para cumplir bien con su función, por ende en este componente he agregado las siguientes propiedades:

Propiedades
  • Buttons, Colección de botones que alojara la columna como el editor.
  • MaskType, que le indicara al editor que tipo de entrada aceptara cuando se edite la celda. (esta propiedad o enum es del control TextEditor).
  • TextAlign, indicara como se alineara el texto en el editor.
  • AllowWhiteSpace, Indicara si el editor permitirá espacios en blanco entre caracteres.
  • CharacterCasingObtiene o establece si el Editor modifica la condición de mayúscula o minúscula de los caracteres a medida que se escriben.
  • Name, que indicara el nombre del componente.
Eventos
  • ButtonClick, sera el evento que se invocara al presionar cualquiera de los botones de la celda como del editor, la idea de usar un componente es poder tener acceso al evento desde el diseñador sin necesidad de instanciarlo desde el Load del contenedor del DataGridView y recibe la siguiente clase como argumento:
 
    public class RepositoryButtonArgs : EventArgs
    {
        public RepositoryButtonArgs(int rowIndex, int buttonIndex)
        {
            this.RowIndex = rowIndex;
            this.ButtonIndex = buttonIndex;
        }
        public int RowIndex { get; private set; }
        public int ButtonIndex { get; private set; }
    }
 
Ademas podemos ver entre los atributos de este componente el uso de CodeDomSerializer, para serializar o persistir en el diseñador la propiedad Buttons de una manera personalizada y ya habiamos visto su utilización con el control ComboBoxMulticolumns.

DataGridViewTextEditorColumn (III Parte).

Comentarios

Entradas populares de este blog

TextBox con Borde Personalizado

Bien, retomando nuevamente mi blog, luego de tanto tiempo ausente, veremos como personalizar el borde del control TextBox con un color diferente. hace poco vi en los foros de MSDN, en el foro de VB.Net esta pregunta, ¿ Cómo puedo cambiar el color del borde de un control TextBox ?, anteriormente también se hizo la misma pregunta en este mismo foro donde yo respondí como hacerlo VB2010 4.0 - Como crear un textbox personalizado . no hay manera fácil de personalizar un control, generalmente se tiene que sobre escribir el evento WndProc para escuchar los mensajes de window y reemplazar la funcionalidad de estos según sea la necesidad o el control. bien, para cambiar el color del borde del control TextBox sin mucha funcionalidad, se debe de escuchar y reemplazar el funcionamiento de los mensajes WM_PAINT y WM_NCPAINT . ¿ Porque WM_PAINT ?, porque cuando cambiamos la propiedad BorderStyle de este control a FixedSingle, quien pinta el borde es el mensaje WM_PAINT no asi el WM_NC

TextBox con Icon/Imagen

Bien, continuando con este articulo: TextBox con borde personalizado , ahora le dare la funcionalidad de poder mostrar un icono o imagen dentro del Control TextBox. Existen dos maneras de hacer esto: Pintar el icono/imagen dentro del control o Pintar el icono/imagen dentro del Non-Client Area del control. Pintar el icono/imagen dentro del control. Antes de escribir el código decidi googlear un poco, para ver si alguien más ya habia tenido la misma idea de usar el mensaje EM_SETMARGINS para dejar el espacio necesario para pintar el icono o imagen ya sea a la derecha o izquierda y me he encontrado con este articulo. Adding an Icon or Control to a TextBox or ComboBox . Pintar el icono/imagen de ntro del Non-Client Area del control. Us ando el Non- Client Area no encontre resultados googleando, así que es la forma que usar e para dib ujar un icono o imagen dentro de un control TextBox. En el control TextEditor que escrib í, utilizo esta manera para pintar el icono

Personalizar DataGridView (II) - Bloquear columnas de solo lectura

Personalizar DataGridView - Actualizaciones Personalizar DataGridView (II.1) - Bloquear columnas de solo lectura. Personalizar DataGridView (III) - Cambiar Diseñador. Bien, continuando con el articulo " Personalizar DataGridView (I) - Pintar área vacía ", ahora lo que haré es darle al control la funcionalidad de bloquear las columnas cuya propiedad " ReadOnly " se establezca en " true ", entiéndase por "Bloquear" el evitar que las columnas cuya propiedad " ReadOnly=true " puedan recibir el foco, ya sea por el teclado o por el ratón ( mouse ). Para tal objetivo agregare una nueva propiedad al control la cual llamare " AllowFocusReadOnlyColumns " cuyo valor predeterminado sera " true ", en caso de ser " false " las columnas marcadas como solo lectura no recibirán el foco. También le daré la funcionalidad de poder avanzar a la siguiente columna al presionar la tecla " ENTER " agregando otr