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

NetBarControl

Actualización.
NetBarControl - Description Item Style (New)




NetBarControl (Outlook Bar) es uno de los controles que muchas veces buscamos para usar en nuestras aplicaciones, pero siempre encontramos en internet versiones pagables y tal vez no contamos con el presupuesto esperado como para comprar uno y las versiones gratis que se logran encontrar, pues como son gratis no implementan en su totalidad la funcionalidad que esperamos encontrar en un control de este tipo. Antes de comenzar a escribir este control dedique tiempo en buscar uno por internet que tuviera toda la funcionalidad o por lo menos una interfaz disponible en modo de diseño, pero, no logre encontrar uno, así que me propuse crearlo como a mí me gustaría que funcionara uno gratis y al final llegue a la conclusión de ¿Porque no hay uno completo, gratis y que incluya el código fuente? y la respuesta es:No es fácil, pero tampoco es cosa de otro mundo. Con esto no digo que otro programador no lo pueda hacer o que los ejemplos en…

ComboBox-MultiColumns

ComboBox-MultiColumns Update


Como bien sabemos el Set de Controles de Windows de .Net Framework incluye el control ComboBox pero este no soporta mostrar multiples columnas, en su lugar muestra una lista simple ya sea agregada manual mente usando la propiedad Items o según el origen de datos definido a traves de la propiedad DataSource, usando la propiedad DisplayMember para indicar la propiedad o campo a mostrar en la lista desplegable. Bien… la ventaja de los controles de .Net Framework es que los podes extender para mejorar su uso en nuestros desarrollos, en este caso extenderemos el Control ComboBox para reemplazar la lista desplegable por nuestra propia versión que mostrara “N” cantidad de columnas que necesitemos, para esto haremos uso de las siguientes clases ToolStripDropDown y ToolStripControlHost. En la ayuda de MSDN podemos encontrar un ejemplo sobre como usar la clase ToolStripDropDown para mostrar un TreeView. parte de este ejemplo lo he tomado para crear este Control ComboBo…

TextEditor

Este control nace a raíz de una pregunta en el foro de Visual Basic .Net, sobre como cambiar el borde de un TextBox a un borde personalizado y además andaba buscando cambiar la apariencia del control NetBarControl para poder aplicarle una nueva propiedad para cambiar el estilo. ejemplo:


Aun que esta imagen solo es un pre-formato de cómo funcionara el control NetBarControl, solo que me distraje creando este nuevo control TextEditor. Así que le echaré mano al terminado este nuevo control.







Bien, la idea inicial era solo agregar botones a un control TextBox, pero luego usando el Mozilla, al descargar unos archivos me percate de un control en la parte inferior de esta venta de descargar, aun que se suele ver mucho en las páginas Web, pero me llamo la atención aquí en el Mozilla y en el Window Live Messenger.


Entonces… me entro el gusano de la curiosidad, agregar la imagen luego de agregar los botones ya no era la parte difícil, la parte curiosa es mostrar el Texto como marca de agua, enco…