Esta documentación está archivada y no tiene mantenimiento.

DataGridColumnStyle (Clase)

Especifica la apariencia, el formato de texto y el comportamiento de una columna de un control System.Windows.Forms.DataGrid. Esta clase es abstracta.

Espacio de nombres: System.Windows.Forms
Ensamblado: System.Windows.Forms (en system.windows.forms.dll)

public abstract class DataGridColumnStyle : Component, IDataGridColumnStyleEditingNotificationService
public abstract class DataGridColumnStyle extends Component implements IDataGridColumnStyleEditingNotificationService
public abstract class DataGridColumnStyle extends Component implements IDataGridColumnStyleEditingNotificationService
No aplicable.

El acceso a la colección de objetos DataGridColumnStyle (GridColumnStylesCollection) se realiza a través de la propiedad TableStyles del control System.Windows.Forms.DataGrid.

El control System.Windows.Forms.DataGrid crea automáticamente una colección de objetos DataGridColumnStyle cuando se establece la propiedad DataSource en un origen de datos correcto. Los objetos creados son realmente instancias de una de las siguientes clases, que se heredan de DataGridColumnStyle: la clase DataGridBoolColumn o la clase DataGridTextBoxColumn.

Para aplicar formato a la presentación de datos, establezca la propiedad Format de la clase DataGridTextBoxColumn en uno de los valores de formato. Para obtener más información sobre los valores de formato válidos, vea Cadenas de formato de fecha y hora y Cadenas con formato numérico estándar.

También puede crear su propio conjunto de objetos DataGridColumnStyle y agregar estos objetos a GridColumnStylesCollection. Si lo hace, debe establecer la propiedad MappingName de cada estilo de columna en la propiedad ColumnName de DataColumn para sincronizar la presentación de las columnas con los datos reales.

Nota de precauciónPrecaución:

Primero deben crearse los objetos DataGridColumnStyle y, después, deben agregarse a GridColumnStylesCollection antes de agregar los objetos DataGridTableStyle a GridTableStylesCollection. Cuando se agrega un objeto DataGridTableStyle vacío con un valor válido MappingName a la colección, se generan automáticamente objetos DataGridColumnStyle. Por lo tanto, se producirá una excepción si se intentan agregar nuevos objetos DataGridColumnStyle a MappingName con valores de GridColumnStylesCollection duplicados.

Cuando un control System.Windows.Forms.DataGrid crea una instancia de una de las clases derivadas, la clase creada depende de la propiedad DataType del objeto DataColumn asociado al objeto DataGridColumnStyle. Por ejemplo, un objeto DataColumn cuya propiedad DataType esté establecida en System.Boolean se asociará a un objeto DataGridBoolColumn. Para determinar el tipo de DataGridColumnStyle, use el método GetType.

Para crear clases de columnas propias, se puede heredar de DataGridColumnStyle. Puede hacer esto último para crear columnas especiales que alojen controles, tal y como se muestra en la clase DataGridTextBox, que aloja el control TextBox. Por ejemplo, es posible alojar un control Image que muestre imágenes en las columnas, y es posible crear un control de usuario personalizado que se aloje en la columna.

La funcionalidad de DataGridColumnStyle no debe confundirse con la de DataColumn. Mientras que DataColumn contiene las propiedades y los métodos adecuados para crear un esquema de tabla de datos, DataGridColumnStyle contiene las propiedades y los métodos relacionados con la apariencia de una columna concreta de la pantalla.

Si una fila contiene DBNull.Value, el texto que se muestra en la columna se puede establecer con la propiedad NullText.

La clase DataGridColumnStyle también permite especificar el comportamiento de una columna mientras sus datos se están modificando. Los métodos BeginUpdate y EndUpdate suspenden provisionalmente el dibujo de la columna mientras se realizan actualizaciones grandes de los datos que contiene. Sin esta funcionalidad, cada cambio realizado en cada celda de la cuadrícula se dibujaría de inmediato, lo que podría confundir al usuario y repercutir negativamente en el rendimiento.

Existen varios métodos que permiten controlar la columna mientras el usuario la está editando, entre ellos: Edit y Commit.

La mayoría de las propiedades y métodos de la clase están proyectados para controlar la apariencia de una columna. Sin embargo, muy pocos, como los métodos GetColumnValueAtRow y SetColumnValueAtRow, permiten examinar y cambiar el valor de una celda especificada.

Notas para los implementadores: Al heredar de DataGridColumnStyle, hay que reemplazar los miembros siguientes: Abort, Commit, Edit y Paint (dos veces).

En el ejemplo de código siguiente se crea un DataGridColumnStyle que aloja un control DateTimePicker.

using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Security.Permissions;

// This example shows how to create your own column style that
// hosts a control, in this case, a DateTimePicker.
public class DataGridTimePickerColumn : DataGridColumnStyle
{
    private CustomDateTimePicker customDateTimePicker1 = 
        new CustomDateTimePicker();

    // The isEditing field tracks whether or not the user is
    // editing data with the hosted control.
    private bool isEditing;

    public DataGridTimePickerColumn() : base()
    {
        customDateTimePicker1.Visible = false;
    }

    protected override void Abort(int rowNum)
    {
        isEditing = false;
        customDateTimePicker1.ValueChanged -=
            new EventHandler(TimePickerValueChanged);
        Invalidate();
    }

    protected override bool Commit
        (CurrencyManager dataSource, int rowNum)
    {
        customDateTimePicker1.Bounds = Rectangle.Empty;

        customDateTimePicker1.ValueChanged -=
            new EventHandler(TimePickerValueChanged);

        if (!isEditing)
            return true;

        isEditing = false;

        try
        {
            DateTime value = customDateTimePicker1.Value;
            SetColumnValueAtRow(dataSource, rowNum, value);
        }
        catch (Exception)
        {
            Abort(rowNum);
            return false;
        }

        Invalidate();
        return true;
    }

    protected override void Edit(
        CurrencyManager source,
        int rowNum,
        Rectangle bounds,
        bool readOnly,
        string displayText,
        bool cellIsVisible)
    {
        DateTime value = (DateTime)
            GetColumnValueAtRow(source, rowNum);
        if (cellIsVisible)
        {
            customDateTimePicker1.Bounds = new Rectangle
                (bounds.X + 2, bounds.Y + 2,
                bounds.Width - 4, bounds.Height - 4);
            customDateTimePicker1.Value = value;
            customDateTimePicker1.Visible = true;
            customDateTimePicker1.ValueChanged +=
                new EventHandler(TimePickerValueChanged);
        }
        else
        {
            customDateTimePicker1.Value = value;
            customDateTimePicker1.Visible = false;
        }

        if (customDateTimePicker1.Visible)
            DataGridTableStyle.DataGrid.Invalidate(bounds);

        customDateTimePicker1.Focus();
    }

    protected override Size GetPreferredSize(
        Graphics g,
        object value)
    {
        return new Size(100, customDateTimePicker1.PreferredHeight + 4);
    }

    protected override int GetMinimumHeight()
    {
        return customDateTimePicker1.PreferredHeight + 4;
    }

    protected override int GetPreferredHeight(Graphics g,
        object value)
    {
        return customDateTimePicker1.PreferredHeight + 4;
    }

    protected override void Paint(Graphics g,
        Rectangle bounds,
        CurrencyManager source,
        int rowNum)
    {
        Paint(g, bounds, source, rowNum, false);
    }

    protected override void Paint(
        Graphics g,
        Rectangle bounds,
        CurrencyManager source,
        int rowNum,
        bool alignToRight)
    {
        Paint(
            g, bounds,
            source,
            rowNum,
            Brushes.Red,
            Brushes.Blue,
            alignToRight);
    }

    protected override void Paint(
        Graphics g,
        Rectangle bounds,
        CurrencyManager source,
        int rowNum,
        Brush backBrush,
        Brush foreBrush,
        bool alignToRight)
    {
        DateTime date = (DateTime)
            GetColumnValueAtRow(source, rowNum);
        Rectangle rect = bounds;
        g.FillRectangle(backBrush, rect);
        rect.Offset(0, 2);
        rect.Height -= 2;
        g.DrawString(date.ToString("d"),
            this.DataGridTableStyle.DataGrid.Font,
            foreBrush, rect);
    }

    protected override void SetDataGridInColumn(DataGrid value)
    {
        base.SetDataGridInColumn(value);
        if (customDateTimePicker1.Parent != null)
        {
            customDateTimePicker1.Parent.Controls.Remove
                (customDateTimePicker1);
        }
        if (value != null)
        {
            value.Controls.Add(customDateTimePicker1);
        }
    }

    private void TimePickerValueChanged(object sender, EventArgs e)
    {
        // Remove the handler to prevent it from being called twice in a row.
        customDateTimePicker1.ValueChanged -=
            new EventHandler(TimePickerValueChanged);
        this.isEditing = true;
        base.ColumnStartedEditing(customDateTimePicker1);
    }
}

public class CustomDateTimePicker : DateTimePicker
{
    [SecurityPermissionAttribute(
    SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
    protected override bool ProcessKeyMessage(ref Message m)
    {
        // Keep all the keys for the DateTimePicker.
        return ProcessKeyEventArgs(ref m);
    }
}

public class MyForm : Form
{
    private DataTable namesDataTable;
    private DataGrid grid = new DataGrid();
    public MyForm() : base()
    {
        InitForm();

        namesDataTable = new DataTable("NamesTable");
        namesDataTable.Columns.Add(new DataColumn("Name"));
        DataColumn dateColumn = new DataColumn
            ("Date", typeof(DateTime));
        dateColumn.DefaultValue = DateTime.Today;
        namesDataTable.Columns.Add(dateColumn);
        DataSet namesDataSet = new DataSet();
        namesDataSet.Tables.Add(namesDataTable);
        grid.DataSource = namesDataSet;
        grid.DataMember = "NamesTable";
        AddGridStyle();
        AddData();
    }

    private void AddGridStyle()
    {
        DataGridTableStyle myGridStyle = new DataGridTableStyle();
        myGridStyle.MappingName = "NamesTable";

        DataGridTextBoxColumn nameColumnStyle =
            new DataGridTextBoxColumn();
        nameColumnStyle.MappingName = "Name";
        nameColumnStyle.HeaderText = "Name";
        myGridStyle.GridColumnStyles.Add(nameColumnStyle);

        DataGridTimePickerColumn timePickerColumnStyle =
            new DataGridTimePickerColumn();
        timePickerColumnStyle.MappingName = "Date";
        timePickerColumnStyle.HeaderText = "Date";
        timePickerColumnStyle.Width = 100;
        myGridStyle.GridColumnStyles.Add(timePickerColumnStyle);

        grid.TableStyles.Add(myGridStyle);
    }

    private void AddData()
    {

        DataRow dRow = namesDataTable.NewRow();
        dRow["Name"] = "Name 1";
        dRow["Date"] = new DateTime(2001, 12, 01);
        namesDataTable.Rows.Add(dRow);

        dRow = namesDataTable.NewRow();
        dRow["Name"] = "Name 2";
        dRow["Date"] = new DateTime(2001, 12, 04);
        namesDataTable.Rows.Add(dRow);

        dRow = namesDataTable.NewRow();
        dRow["Name"] = "Name 3";
        dRow["Date"] = new DateTime(2001, 12, 29);
        namesDataTable.Rows.Add(dRow);

        dRow = namesDataTable.NewRow();
        dRow["Name"] = "Name 4";
        dRow["Date"] = new DateTime(2001, 12, 13);
        namesDataTable.Rows.Add(dRow);

        dRow = namesDataTable.NewRow();
        dRow["Name"] = "Name 5";
        dRow["Date"] = new DateTime(2001, 12, 21);
        namesDataTable.Rows.Add(dRow);

        namesDataTable.AcceptChanges();
    }

    private void InitForm()
    {
        this.Size = new Size(500, 500);
        grid.Size = new Size(350, 250);
        grid.TabStop = true;
        grid.TabIndex = 1;
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Controls.Add(grid);
    }
 
    [STAThread]
    public static void Main()
    {
        Application.Run(new MyForm());
    }
}

Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 2.0, 1.0
Mostrar: