Windows Forms DataGridView Denetiminde Sütun Doldurma Modu
Sütun doldurma modunda denetim, DataGridView sütunlarını otomatik olarak yeniden boyutlandırarak kullanılabilir görüntüleme alanı genişliğini doldurmasını sağlar. Denetim, her sütunun genişliğinin özellik değerine eşit veya daha büyük olması dışında yatay kaydırma çubuğunu MinimumWidth görüntülemez.
Her sütunun boyutlandırma davranışı özelliğine InheritedAutoSizeMode bağlıdır. Bu özelliğin değeri, sütunun özelliğinden veya sütun değeri (varsayılan değer) ise denetimin AutoSizeMode AutoSizeColumnsMode NotSet özelliğinden devralınmış olur.
Her sütunun farklı boyut modu olabilir, ancak boyut modu olan tüm sütunlar diğer sütunlar tarafından kullanılmadan görüntüleme Fill alanı genişliğini paylaşır. Bu genişlik, özellik değerlerine göre oranlarda dolgu modu sütunları arasında FillWeight bölündü. Örneğin, iki sütunda FillWeight 100 ve 200 değerleri varsa, ilk sütun ikinci sütunun yarısı kadar geniş olur.
Dolgu Modunda Kullanıcı Yeniden Boyutlandırma
Hücre içeriğine göre yeniden boyutlandıran boyutlandırma modlarından farklı olarak, dolgu modu kullanıcıların özellik değerlerine sahip sütunları yeniden Resizable boyutlandırmasını true engellemez. Kullanıcı bir dolgu modu sütununu yeniden boyutlandırsa, yeniden boyutlandırıldı sütunundan sonra gelen tüm dolgu modu sütunları (sağ tarafta ise; değilse, sol tarafta) kullanılabilir genişlikte değişikliği telafi etmek için de yeniden RightToLeft false boyutlandırılır. Yeniden boyutlandırıldı sütunundan sonra dolgu modu sütunu yoksa denetimde yer alan diğer tüm dolgu modu sütunları telafi etmek için yeniden boyutlandırılır. Denetimde başka dolgu modu sütunu yoksayılır. Dolgu modunda olmayan bir sütun yeniden boyutlandırılırsa, denetimde tüm dolgu modu sütunları dengelemek için boyutları değiştirir.
Dolgu modu sütununu yeniden boyutlandırmanın ardından değiştirilen FillWeight tüm sütunların değerleri orantılı olarak ayarlanır. Örneğin, dört dolgu modu sütunu 100 değerine sahipse, ikinci sütunu özgün genişliğinin yarısına yeniden boyutlandırmak FillWeight FillWeight 100, 50, 125 ve 125 değerlerine neden olur. Dolgu modunda olmayan bir sütunu yeniden boyutlandırmak hiçbir değeri değiştirmez çünkü dolgu modu sütunları aynı oranları korurken bunu telafi etmek için yeniden FillWeight boyutlandırılır.
İçerik Tabanlı FillWeight Ayarlaması
Yöntemi gibi otomatik yeniden boyutlandırma yöntemlerini kullanarak dolgu FillWeight modu sütunları için değerleri DataGridView AutoResizeColumns başlatabilirsiniz. Bu yöntem ilk olarak sütunların içeriklerini görüntülemesi için gereken genişlikleri hesaplar. Ardından denetim tüm dolgu modu sütunlarının değerlerini ayarlanarak oranlarının hesaplanan FillWeight genişliklerin oranlarıyla eşleşmesini sağlar. Son olarak denetim, yeni oranları kullanarak dolgu modu sütunlarını yeniden boyutlandırarak denetimde yer alan tüm FillWeight sütunların kullanılabilir yatay alanı doldurması sağlar.
Örnek
Açıklama
, , ve özellikleri için uygun değerleri kullanarak, birçok farklı senaryo AutoSizeMode için sütun boyutlandırma davranışlarını MinimumWidth FillWeight Resizable özelleştirebilirsiniz.
Aşağıdaki tanıtım kodu, farklı sütunların , ve özellikleri için farklı AutoSizeMode FillWeight değerlerle MinimumWidth denemeler yapabilirsiniz. Bu örnekte bir denetim kendi koleksiyonuna, bir sütun ise , , , ve özelliklerinin her bir DataGridView Columns HeaderText AutoSizeMode FillWeight MinimumWidth türüne Width bağımlıdır. Sütunların her biri denetimde bir satırla da temsil eder ve bir satırdaki değerleri değiştirerek karşılık gelen sütunun özelliklerini güncelleştirerek değerlerin nasıl etkileşim kuracaklarını görmenizi sağlar.
Kod
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
Yorumlar
Bu tanıtım uygulamasını kullanmak için:
Formun boyutunu değiştirme. Sütunların genişliklerini değiştirerek özellik değerleriyle belirtilen oranları nasıl koruyarak değiştiklerine FillWeight dikkat eder.
Sütun bölmelerini fareyle sürükleyerek sütun boyutlarını değiştirebilirsiniz. Değerlerin nasıl FillWeight değiştiklerini gözlemlemek.
Bir MinimumWidth sütunun değerini değiştirerek formu yeniden boyutlandırmak için sürükleyin. Formu yeterince küçük hale geldiğinde değerlerin Width değerlerin altına MinimumWidth gitmeyebilirsiniz.
Birleştirilmiş MinimumWidth değerlerin denetimin genişliğini aşması için tüm sütunların değerlerini büyük sayılarla değiştirebilirsiniz. Yatay kaydırma çubuğunun nasıl göründüğüne dikkat alın.
Bazı AutoSizeMode sütunların değerlerini değiştirme. Sütunları veya formu yeniden boyutlandırarak etkiyi gözlemler.
Kod Derleniyor
Bu örnek şunları gerektirir:
- System, System.Drawing ve System başvuruları. Windows. Derlemeleri oluşturur.
Ayrıca bkz.
- DataGridView
- DataGridView.AutoResizeColumns
- DataGridView.AutoSizeColumnsMode
- DataGridViewAutoSizeColumnsMode
- DataGridViewColumn
- DataGridViewColumn.InheritedAutoSizeMode
- DataGridViewColumn.AutoSizeMode
- DataGridViewAutoSizeColumnMode
- DataGridViewColumn.FillWeight
- DataGridViewColumn.MinimumWidth
- DataGridViewColumn.Width
- DataGridViewColumn.Resizable
- Control.RightToLeft
- Windows Forms DataGridView Denetiminde Hücre ve Satırları Yeniden Boyutlandırma