Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el modo de relleno de columnas, el DataGridView control cambia el tamaño de sus columnas automáticamente para que rellenen el ancho del área de visualización disponible. El control no muestra la barra de desplazamiento horizontal, excepto cuando es necesario mantener el ancho de cada columna igual o mayor que su MinimumWidth valor de propiedad.
El comportamiento de ajuste de tamaño de cada columna depende de su InheritedAutoSizeMode propiedad. El valor de esta propiedad se hereda de la propiedad AutoSizeMode de la columna o de la propiedad AutoSizeColumnsMode del control si el valor de la columna es NotSet (el valor por defecto).
Cada columna puede tener un modo de tamaño diferente, pero cualquier columna con un modo de tamaño de Fill compartirá el ancho del área de visualización que no usan las otras columnas. Este ancho se divide entre las columnas en modo de relleno en proporciones relativas a sus FillWeight valores de propiedad. Por ejemplo, si dos columnas tienen FillWeight valores de 100 y 200, la primera columna será la mitad del ancho que la segunda columna.
Redimensionamiento por el usuario en el modo de relleno
A diferencia de los modos de ajuste de tamaño que cambian el tamaño en función del contenido de la celda, el modo de relleno no impide que los usuarios cambien el tamaño de las columnas que tienen Resizable valores de propiedad de true. Cuando un usuario cambia el tamaño de una columna en modo de relleno, las columnas en modo de relleno después de la columna cambiada de tamaño (a la derecha si RightToLeft es false; de lo contrario, a la izquierda) también se cambia para compensar el cambio en el ancho disponible. Si no hay columnas en modo de relleno después de la columna redimensionada, entonces todas las demás columnas en modo de relleno dentro del control se redimensionan para compensar. Si no hay ninguna otra columna en modo de relleno en el control, se omite el cambio de tamaño. Si se cambia el tamaño de una columna que no está en modo de relleno, todas las columnas en modo de relleno del control cambian los tamaños para compensar.
Después de cambiar el tamaño de una columna en modo de relleno, los FillWeight valores de todas las columnas que han cambiado se ajustan proporcionalmente. Por ejemplo, si cuatro columnas en modo de relleno tienen FillWeight valores de 100, cambiar el tamaño de la segunda columna a la mitad de su ancho original dará como resultado FillWeight valores de 100, 50, 125 y 125. Cambiar el tamaño de una columna que no está en modo de relleno no cambiará ningún FillWeight valor porque las columnas en modo de relleno simplemente cambiarán el tamaño para compensar y conservar las mismas proporciones.
Ajuste de relleno basado en contenido
Puede inicializar FillWeight valores para las columnas en modo de relleno mediante los DataGridView métodos de cambio de tamaño automático, como el AutoResizeColumns método . Este método calcula primero los anchos requeridos por las columnas para mostrar su contenido. A continuación, el control ajusta los FillWeight valores de todas las columnas en modo de relleno para que sus proporciones coincidan con las proporciones de los anchos calculados. Por último, el control cambia el tamaño de las columnas en modo de relleno con las nuevas FillWeight proporciones para que todas las columnas del control rellenen el espacio horizontal disponible.
Ejemplo
Descripción
Mediante el uso de valores adecuados para las AutoSizeModepropiedades , MinimumWidth, FillWeighty Resizable , puede personalizar los comportamientos de ajuste de tamaño de columna para muchos escenarios diferentes.
El siguiente código de demostración permite experimentar con valores diferentes para las AutoSizeModepropiedades , FillWeighty MinimumWidth de columnas diferentes. En este ejemplo, un DataGridView control está enlazado a su propia Columns colección y una columna está enlazada a cada una de las HeaderTextpropiedades , AutoSizeMode, FillWeight, MinimumWidthy Width . Cada una de las columnas también se representa mediante una fila del control y el cambio de valores de una fila actualizará las propiedades de la columna correspondiente para que pueda ver cómo interactúan los valores.
Código
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms;
public class Form1 : Form
{
[STAThread]
public static void Main()
{
Application.Run(new Form1());
}
private DataGridView dataGridView1 = new DataGridView();
public Form1()
{
dataGridView1.Dock = DockStyle.Fill;
Controls.Add(dataGridView1);
InitializeDataGridView();
Width *= 2;
Text = "Column Fill-Mode Demo";
}
private void InitializeDataGridView()
{
// Add columns to the DataGridView, binding them to the
// specified DataGridViewColumn properties.
AddReadOnlyColumn("HeaderText", "Column");
AddColumn("AutoSizeMode");
AddColumn("FillWeight");
AddColumn("MinimumWidth");
AddColumn("Width");
// Bind the DataGridView to its own Columns collection.
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dataGridView1.Columns;
// Configure the DataGridView so that users can manually change
// only the column widths, which are set to fill mode.
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
dataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.Fill;
// Configure the top left header cell as a reset button.
dataGridView1.TopLeftHeaderCell.Value = "reset";
dataGridView1.TopLeftHeaderCell.Style.ForeColor =
System.Drawing.Color.Blue;
// Add handlers to DataGridView events.
dataGridView1.CellClick +=
new DataGridViewCellEventHandler(dataGridView1_CellClick);
dataGridView1.ColumnWidthChanged += new
DataGridViewColumnEventHandler(dataGridView1_ColumnWidthChanged);
dataGridView1.CurrentCellDirtyStateChanged +=
new EventHandler(dataGridView1_CurrentCellDirtyStateChanged);
dataGridView1.DataError +=
new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
dataGridView1.CellEndEdit +=
new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
dataGridView1.CellValueChanged +=
new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
}
private void AddReadOnlyColumn(String dataPropertyName, String columnName)
{
AddColumn(typeof(DataGridViewColumn), dataPropertyName, true,
columnName);
}
private void AddColumn(String dataPropertyName)
{
AddColumn(typeof(DataGridViewColumn), dataPropertyName, false,
dataPropertyName);
}
// Adds a column to the DataGridView control, binding it to specified
// property of the specified type and optionally making it read-only.
private void AddColumn(
Type type,
String dataPropertyName,
Boolean readOnly,
String columnName)
{
// Retrieve information about the property through reflection.
PropertyInfo property = type.GetProperty(dataPropertyName);
// Confirm that the property exists and is accessible.
if (property == null) throw new ArgumentException("No accessible " +
dataPropertyName + " property was found in the " + type.Name + " type.");
// Confirm that the property is browsable.
BrowsableAttribute[] browsables = (BrowsableAttribute[])
property.GetCustomAttributes(typeof(BrowsableAttribute), false);
if (browsables.Length > 0 && !browsables[0].Browsable)
{
throw new ArgumentException("The " + dataPropertyName + " property has a " +
"Browsable(false) attribute, and therefore cannot be bound.");
}
// Create and initialize a column, using a combo box column for
// enumeration properties, a check box column for Boolean properties,
// and a text box column otherwise.
DataGridViewColumn column;
Type valueType = property.PropertyType;
if (valueType.IsEnum)
{
column = new DataGridViewComboBoxColumn();
// Populate the drop-down list with the enumeration values.
((DataGridViewComboBoxColumn)column).DataSource
= Enum.GetValues(valueType);
}
else if (valueType.Equals(typeof(Boolean)))
{
column = new DataGridViewCheckBoxColumn();
}
else
{
column = new DataGridViewTextBoxColumn();
}
// Initialize and bind the column.
column.ValueType = valueType;
column.Name = columnName;
column.DataPropertyName = dataPropertyName;
column.ReadOnly = readOnly;
// Add the column to the control.
dataGridView1.Columns.Add(column);
}
private void ResetDataGridView()
{
dataGridView1.CancelEdit();
dataGridView1.Columns.Clear();
dataGridView1.DataSource = null;
InitializeDataGridView();
}
private void dataGridView1_CellClick(
object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
ResetDataGridView();
}
}
private void dataGridView1_ColumnWidthChanged(
object sender, DataGridViewColumnEventArgs e)
{
// Invalidate the row corresponding to the column that changed
// to ensure that the FillWeight and Width entries are updated.
dataGridView1.InvalidateRow(e.Column.Index);
}
private void dataGridView1_CurrentCellDirtyStateChanged(
object sender, EventArgs e)
{
// For combo box and check box cells, commit any value change as soon
// as it is made rather than waiting for the focus to leave the cell.
if (!dataGridView1.CurrentCell.OwningColumn.GetType()
.Equals(typeof(DataGridViewTextBoxColumn)))
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_DataError(
object sender, DataGridViewDataErrorEventArgs e)
{
if (e.Exception == null) return;
// If the user-specified value is invalid, cancel the change
// and display the error icon in the row header.
if ((e.Context & DataGridViewDataErrorContexts.Commit) != 0 &&
(typeof(FormatException).IsAssignableFrom(e.Exception.GetType()) ||
typeof(ArgumentException).IsAssignableFrom(e.Exception.GetType())))
{
dataGridView1.Rows[e.RowIndex].ErrorText =
"The specified value is invalid.";
e.Cancel = true;
}
else
{
// Rethrow any exceptions that aren't related to the user input.
e.ThrowException = true;
}
}
private void dataGridView1_CellEndEdit(
object sender, DataGridViewCellEventArgs e)
{
// Ensure that the error icon in the row header is hidden.
dataGridView1.Rows[e.RowIndex].ErrorText = "";
}
private void dataGridView1_CellValueChanged(
object sender, DataGridViewCellEventArgs e)
{
// Retrieve the property to change.
String nameOfPropertyToChange =
dataGridView1.Columns[e.ColumnIndex].Name;
PropertyInfo propertyToChange =
typeof(DataGridViewColumn).GetProperty(nameOfPropertyToChange);
// Retrieve the column to change.
String nameOfColumnToChange =
(String)dataGridView1["Column", e.RowIndex].Value;
DataGridViewColumn columnToChange =
dataGridView1.Columns[nameOfColumnToChange];
// Use reflection to update the value of the column property.
propertyToChange.SetValue(columnToChange,
dataGridView1[nameOfPropertyToChange, e.RowIndex].Value, null);
}
}
Imports System.ComponentModel
Imports System.Reflection
Imports System.Windows.Forms
Public Class Form1
Inherits Form
<STAThread()> _
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
Private WithEvents dataGridView1 As New DataGridView()
Public Sub New()
dataGridView1.Dock = DockStyle.Fill
Controls.Add(dataGridView1)
InitializeDataGridView()
Width = Width * 2
Text = "Column Fill-Mode Demo"
End Sub
Private Sub InitializeDataGridView()
' Add columns to the DataGridView, binding them to the
' specified DataGridViewColumn properties.
AddReadOnlyColumn("HeaderText", "Column")
AddColumn("AutoSizeMode")
AddColumn("FillWeight")
AddColumn("MinimumWidth")
AddColumn("Width")
' Bind the DataGridView to its own Columns collection.
dataGridView1.AutoGenerateColumns = False
dataGridView1.DataSource = dataGridView1.Columns
' Configure the DataGridView so that users can manually change
' only the column widths, which are set to fill mode.
dataGridView1.AllowUserToAddRows = False
dataGridView1.AllowUserToDeleteRows = False
dataGridView1.AllowUserToResizeRows = False
dataGridView1.RowHeadersWidthSizeMode = _
DataGridViewRowHeadersWidthSizeMode.DisableResizing
dataGridView1.ColumnHeadersHeightSizeMode = _
DataGridViewColumnHeadersHeightSizeMode.DisableResizing
dataGridView1.AutoSizeColumnsMode = _
DataGridViewAutoSizeColumnsMode.Fill
' Configure the top left header cell as a reset button.
dataGridView1.TopLeftHeaderCell.Value = "reset"
dataGridView1.TopLeftHeaderCell.Style.ForeColor = _
System.Drawing.Color.Blue
End Sub
Private Sub AddReadOnlyColumn(ByVal dataPropertyName As String, _
ByVal columnName As String)
AddColumn(GetType(DataGridViewColumn), dataPropertyName, True, _
columnName)
End Sub
Private Sub AddColumn(ByVal dataPropertyName As String)
AddColumn(GetType(DataGridViewColumn), dataPropertyName, False, _
dataPropertyName)
End Sub
' Adds a column to the DataGridView control, binding it to specified
' property of the specified type and optionally making it read-only.
Private Sub AddColumn( _
ByVal type As Type, _
ByVal dataPropertyName As String, _
ByVal isReadOnly As Boolean, _
ByVal columnName As String)
' Retrieve information about the property through reflection.
Dim propertyInfo1 As PropertyInfo = type.GetProperty(dataPropertyName)
' Confirm that the property exists and is accessible.
If propertyInfo1 Is Nothing Then
Throw New ArgumentException("No accessible " & dataPropertyName & _
" property was found in the " & type.Name & " type.")
End If
' Confirm that the property is browsable.
Dim browsables As BrowsableAttribute() = CType( _
propertyInfo1.GetCustomAttributes(GetType(BrowsableAttribute), _
False), BrowsableAttribute())
If browsables.Length > 0 AndAlso Not browsables(0).Browsable Then
Throw New ArgumentException("The " & dataPropertyName & " property has a " & _
"Browsable(false) attribute, and therefore cannot be bound.")
End If
' Create and initialize a column, using a combo box column for
' enumeration properties, a check box column for Boolean properties,
' and a text box column otherwise.
Dim column As DataGridViewColumn
Dim valueType As Type = propertyInfo1.PropertyType
If valueType.IsEnum Then
column = New DataGridViewComboBoxColumn()
' Populate the drop-down list with the enumeration values.
CType(column, DataGridViewComboBoxColumn).DataSource = _
[Enum].GetValues(valueType)
ElseIf valueType.Equals(GetType(Boolean)) Then
column = New DataGridViewCheckBoxColumn()
Else
column = New DataGridViewTextBoxColumn()
End If
' Initialize and bind the column.
column.ValueType = valueType
column.Name = columnName
column.DataPropertyName = dataPropertyName
column.ReadOnly = isReadOnly
' Add the column to the control.
dataGridView1.Columns.Add(column)
End Sub
Private Sub ResetDataGridView()
dataGridView1.CancelEdit()
dataGridView1.Columns.Clear()
dataGridView1.DataSource = Nothing
InitializeDataGridView()
End Sub
Private Sub dataGridView1_CellClick( _
ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles dataGridView1.CellClick
If e.ColumnIndex = -1 AndAlso e.RowIndex = -1 Then
ResetDataGridView()
End If
End Sub
Private Sub dataGridView1_ColumnWidthChanged( _
ByVal sender As Object, ByVal e As DataGridViewColumnEventArgs) _
Handles dataGridView1.ColumnWidthChanged
' Invalidate the row corresponding to the column that changed
' to ensure that the FillWeight and Width entries are updated.
dataGridView1.InvalidateRow(e.Column.Index)
End Sub
Private Sub dataGridView1_CurrentCellDirtyStateChanged( _
ByVal sender As Object, ByVal e As EventArgs) _
Handles dataGridView1.CurrentCellDirtyStateChanged
' For combo box and check box cells, commit any value change as soon
' as it is made rather than waiting for the focus to leave the cell.
If Not dataGridView1.CurrentCell.OwningColumn.GetType() _
.Equals(GetType(DataGridViewTextBoxColumn)) Then
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Private Sub dataGridView1_DataError( _
ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) _
Handles dataGridView1.DataError
If e.Exception Is Nothing Then Return
' If the user-specified value is invalid, cancel the change
' and display the error icon in the row header.
If Not (e.Context And DataGridViewDataErrorContexts.Commit) = 0 AndAlso _
(GetType(FormatException).IsAssignableFrom(e.Exception.GetType()) Or _
GetType(ArgumentException).IsAssignableFrom(e.Exception.GetType())) Then
dataGridView1.Rows(e.RowIndex).ErrorText = e.Exception.Message
e.Cancel = True
Else
' Rethrow any exceptions that aren't related to the user input.
e.ThrowException = True
End If
End Sub
Private Sub dataGridView1_CellEndEdit( _
ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles dataGridView1.CellEndEdit
' Ensure that the error icon in the row header is hidden.
dataGridView1.Rows(e.RowIndex).ErrorText = ""
End Sub
Private Sub dataGridView1_CellValueChanged( _
ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles dataGridView1.CellValueChanged
' Ignore the change to the top-left header cell.
If e.ColumnIndex < 0 Then Return
' Retrieve the property to change.
Dim nameOfPropertyToChange As String = _
dataGridView1.Columns(e.ColumnIndex).Name
Dim propertyToChange As PropertyInfo = _
GetType(DataGridViewColumn).GetProperty(nameOfPropertyToChange)
' Retrieve the column to change.
Dim nameOfColumnToChange As String = _
CStr(dataGridView1("Column", e.RowIndex).Value)
Dim columnToChange As DataGridViewColumn = _
dataGridView1.Columns(nameOfColumnToChange)
' Use reflection to update the value of the column property.
propertyToChange.SetValue(columnToChange, _
dataGridView1(nameOfPropertyToChange, e.RowIndex).Value, Nothing)
End Sub
End Class
Comentarios
Para usar esta aplicación de demostración:
Cambie el tamaño del formulario. Observe cómo las columnas cambian sus anchos mientras conservan las proporciones indicadas por los valores de propiedad FillWeight .
Cambie los tamaños de columna arrastrando los divisores de columna con el mouse. Observe cómo cambian los FillWeight valores.
Cambie el MinimumWidth valor de una columna y, a continuación, arrástrelo para cambiar el tamaño del formulario. Observe cómo, al hacer que el formulario sea lo suficientemente pequeño, los Width valores no van por debajo de los MinimumWidth valores.
Cambie los MinimumWidth valores de todas las columnas a números grandes para que los valores combinados superen el ancho del control. Observe cómo aparece la barra de desplazamiento horizontal.
Cambie los AutoSizeMode valores de algunas columnas. Observe el efecto al cambiar el tamaño de las columnas o el formulario.
Compilar el código
Este ejemplo requiere:
- Referencias a los ensamblados System, System.Drawing y System.Windows.Forms.
Consulte también
- DataGridView
- DataGridView.AutoResizeColumns
- DataGridView.AutoSizeColumnsMode
- DataGridViewAutoSizeColumnsMode
- DataGridViewColumn
- DataGridViewColumn.InheritedAutoSizeMode
- DataGridViewColumn.AutoSizeMode
- DataGridViewAutoSizeColumnMode
- DataGridViewColumn.FillWeight
- DataGridViewColumn.MinimumWidth
- DataGridViewColumn.Width
- DataGridViewColumn.Resizable
- Control.RightToLeft
- Redimensionamiento de columnas y filas en el control DataGridView de Windows Forms
.NET Desktop feedback