我有一个奇怪的问题。我通过设置datatable
属性将DataGridView
绑定到.DataSource
,之后我无法访问DataGridView列。
Dim dtPML As New DataTable
dtPML.Columns.Add("ID_IN_DATASOURCE", Type.GetType("System.String"))
dtPML.Columns.Add("SELECTED", Type.GetType("System.Boolean"))
dtPML.Columns.Add("DESCRIPTION", Type.GetType("System.String"))
grdHorizonPMLRadit.DataSource = dtPML
'next line fails with NullReferenceException
grdHorizonPMLRadit.Columns("ID_IN_DATASOURCE").Visible = False
检查grdHorizonPMLRadit.Columns.Count
时,它会显示零列,但CType(grdHorizonPMLRadit.DataSource, DataTable).Columns.Count
会返回3.
为什么还没有DataGridView
从Datatable
生成列?
.AutoGenerateColumns
属性设置为true。是在另一个线程中完成还是仅在绘制网格时?如果我只是设置了Datasource并且没有触及.Columns集合,直到表单完全加载,那么列就可以访问了。
奇怪的是,我之前已经做过这件事并且工作正常。我最近切换到Visual Studio 2013,Datagridview
数据处理是否有某些变化?
提前谢谢。
答案 0 :(得分:1)
是的,您注意到的行为是正常。即使您设置了DataSource
属性,DatagridView
也不会创建列,直到显示网格。
尝试在DataGridView.DataBindingComplete事件中移动此行代码以确保创建列:
grdHorizonPMLRadit.Columns("ID_IN_DATASOURCE").Visible = False
答案 1 :(得分:0)
这已经很老了,所以我想给出一个笼统的答案。
TD;DL:您的 DataGridView 必须在表单内。与显示无关。
示例代码:
Dim dataGrid = New DataGridView()
' This is needed to make the DataTable apply to DataGridView
Dim form = New System.Windows.Forms.Form()
form.Controls.Add(dataGrid)
dataGrid.DataSource = createDataTable()
' dataGrid.Columns.Count() > 0