我正在VB中为一个类进行.NET 3.5编程。我有一个包含3个相关表的.mdb数据库,以及一个包含一些查询的表适配器,如下所示:
SELECT PropertyID, Street, Unit, City, Zip, Type, Bedrooms, Bathrooms, Area, MonthlyRent
FROM tblProperties
然后在表格中我有一个DataGridView。我想要做的是获取查询返回的数据并将其显示在DGV中。但是,当我这样做时,它会显示数据库中的所有35列,而不是我选择的10列(十个是唯一有数据的列,但是......所以它基本上是一个包含大量空白列的表)。
我当前的,不优雅的解决方案是将查询返回到DataTable,然后遍历表的列,删除我不想要的那个。这不稳健,高效,并且不像我删除主键列。
我的TA建议尝试使用无类型数据绑定...他说这应该只显示我提取的数据,但我们都没有能够解决这个问题。
谢谢!
更新
我不确定.aspx / .aspx.vb页面是什么意思,但这是我从表适配器获取的查询代码
SELECT tblRent.PaymentID, tblTenant.TenantName, tblProperties.Street, tblProperties.Unit, tblProperties.City, tblRent.AmountPaid, tblRent.PaymentDate,
tblTenant.Telephone
FROM ((tblProperties INNER JOIN
tblRent ON tblProperties.PropertyID = tblRent.PropertyID) INNER JOIN
tblTenant ON tblProperties.PropertyID = tblTenant.PropertyID)
这是我在代码中使用它的地方:
Public Sub getRent()
propView.DataSource = TblPropertiesTableAdapter.GetAllRentReceipts()
propView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
propView.ReadOnly = True
End Sub
propView是一个DataGridView,它没有在加载时选择DataSource
答案 0 :(得分:1)
我假设您使用的是Windows表单,而DataGridView
启用了AutoGenerateColumns
。
如果您添加自己的列,则只显示您选择的列:
propView.AutoGenerateColumns = false
For Each //of the columns that you want
dim column as DataGridViewColumn = New DataGridViewColumn()
column.DataPropertyName = "DB field name"
column.HeaderText = "column title"
propView.Columns.Add( column )
Next
答案 1 :(得分:1)
如果使用标记构建页面,则需要页面中的以下代码...
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MY_ConnectionString %>"
SelectCommand="SELECT tblRent.PaymentID, tblTenant.TenantName, tblProperties.Street, tblProperties.Unit, tblProperties.City, tblRent.AmountPaid, tblRent.PaymentDate, tblTenant.TelephoneFROM ((tblProperties INNER JOIN tblRent ON tblProperties.PropertyID = tblRent.PropertyID) INNER JOIN tblTenant ON tblProperties.PropertyID = tblTenant.PropertyID)"></asp:SqlDataSource>
如果您想使用数据层的代码,您可以使用以下内容...
Public Class DataLayer
Public Function GetData(ByVal query As String, ByVal params As System.Data.Common.DbParameter()) As System.Data.DataTable
Dim dt As New System.Data.DataTable
Dim constr As String = System.Configuration.ConfigurationManager.ConnectionStrings("constr").ConnectionString()
Using cnObject As New System.Data.SqlClient.SqlConnection(constr)
Using cmd As New System.Data.SqlClient.SqlCommand(query, cnObject)
If Not params Is Nothing Then
For Each param In params
cmd.Parameters.Add(param)
Next
End If
Using da As New System.Data.SqlClient.SqlDataAdapter(cmd)
da.Fill(dt)
Return dt
End Using
End Using
End Using
End Function
End Class
如果您正在使用OLEDB连接,可以按如下方式更改此功能(这意味着您只需更改一个功能即可在应用程序中更新它的每次使用 - 很好)
Public Function GetDataOLE(ByVal query As String, ByVal params As System.Data.Common.DbParameter()) As System.Data.DataTable
Dim dt As New System.Data.DataTable
Dim constr As String = System.Configuration.ConfigurationManager.ConnectionStrings("constr").ConnectionString()
Using cnObject As New System.Data.OleDb.OleDbConnection(constr)
Using cmd As New System.Data.OleDb.OleDbCommand(query, cnObject)
If Not params Is Nothing Then
For Each param In params
cmd.Parameters.Add(param)
Next
End If
Using da As New System.Data.OleDb.OleDbDataAdapter(cmd)
da.Fill(dt)
Return dt
End Using
End Using
End Using
End Function
此函数的工作原理是一个通用数据层,它将接收任何SQL命令并在DataTable中输出数据,这些数据可以简单地绑定到网格视图或类似物。您可以检查“查询”是否仅选择所需的列,但调试代码并检查数据库的SQL命令。
我会将它构建到一个类中,以便任何页面都可以访问它以将数据加载到数据表中。
您的代码将成为
Public Sub getRent()
Dim dataLayer As New DataLayer()
Dim sqlText As String = "<insert your query text here>"
propView.DataSource = dataLayer.getData(sqlText, Nothing)
propView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
propView.ReadOnly = True
End Sub