【问题标题】:Forcing AutoGenerateColumns to create DataGridViewTextBoxColumn for Boolean Data Types强制 AutoGenerateColumns 为布尔数据类型创建 DataGridViewTextBoxColumn
【发布时间】:2012-12-05 14:33:30
【问题描述】:
我有很多只读数据,我不喜欢 DataGridViewCheckBoxColumns 的可点击外观和感觉,不幸的是,它是呈现布尔数据的默认类型。
在使用DataGridView 的AutoGenerateColumns 之前或之后,有什么方法可以强制它生成DataGridViewTextBoxColumns,它只会打印TRUE 或FALSE 而不是DataGridViewCheckBoxColumns?
如果在将DataTable 设置为DataSource 之前更容易在DataTable 上解决此问题,那也可以。
【问题讨论】:
标签:
.net
winforms
datagridview
autogeneratecolumn
【解决方案1】:
如果您想继续使用AutoGenerateColumns = True 和DataGridViewCheckBoxColumn,您可以修改外观和行为,使其看起来和行为类似于只读字段。
假设您想要定位所有 CheckBoxCell,您可以禁用它们并更改它们的外观,如下所示:
For Each row In DataGridView1.Rows.Cast(Of DataGridViewRow)()
For Each cell In row.Cells.OfType(Of DataGridViewCheckBoxCell)()
cell.ReadOnly = True
cell.FlatStyle = FlatStyle.Flat
cell.Style.ForeColor = Color.DarkSlateGray
Next
Next
【解决方案2】:
我想我会分享我针对上述问题的解决方法,以防其他人试图完成同样的事情。我只是关闭AutoGenerateColumns 并通过循环遍历DataTable 中的列集合来创建我自己的列。每次都清除数据源和列很重要,以防它们因调用而异。除此之外,我只设置了 DataTable 列中的 col 名称、标题和数据属性,我们就可以开始了。
''' <summary>
''' Generates DataGridViewTextBox Columns for every field of data in the data source
''' </summary>
''' <param name="dgv">The DataGridView having columns and data generated</param>
''' <param name="dt">The source data as a DataTable</param>
''' <remarks></remarks>
Private Sub AutoGenerateTextBoxColumns(ByVal dgv As DataGridView, ByVal dt As DataTable)
'declare local variables
Dim column As DataGridViewTextBoxColumn
'first clear datasource and columns
If Not IsNothing(dgv.DataSource) Then dgv.DataSource.Clear()
'clear way for potentially different columns
If Not IsNothing(dgv.Columns) Then dgv.Columns.Clear()
'set autogenerate columns to false
dgv.AutoGenerateColumns = False
'generate columns for DataGridView
For Each col As DataColumn In dt.Columns
column = New DataGridViewTextBoxColumn()
With column
.HeaderText = col.ColumnName
.DataPropertyName = col.ColumnName
.Name = col.ColumnName
End With
dgv.Columns.Add(column)
Next
'add datatable as datasource
dgv.DataSource = dt
End Sub