0

我正在为一个类在 VB 中进行 .NET 3.5 编程。我有一个带有 3 个相关表的 .mdb 数据库,以及一个带有一些查询的表适配器,如下所示:

SELECT     PropertyID, Street, Unit, City, Zip, Type, Bedrooms, Bathrooms, Area, MonthlyRent
FROM         tblProperties

然后在一个表单中我有一个 DataGridView。我想要做的是获取从查询返回的数据并将其显示在 DGV 中。但是,当我这样做时,它会显示数据库中的所有 35 列,而不是我选择的 10 列(这 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

4

2 回答 2

1

I'm assuming that you're using Windows forms and a DataGridView with AutoGenerateColumns turned on.

If you add you own columns only the ones that you select will appear:

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
于 2008-11-03T11:01:55.537 回答
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
于 2008-11-03T11:59:27.417 回答