查看选定的列

时间:2008-11-03 09:03:35

标签: sql vb.net datagridview dataview

我正在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

2 个答案:

答案 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