Просмотр выбранных столбцов - PullRequest
0 голосов
/ 03 ноября 2008

Я занимаюсь программированием на .NET 3.5 в VB для класса. У меня есть база данных .mdb с 3 связанными таблицами и адаптер таблицы с некоторыми запросами, которые выглядят так:

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

Тогда в форме у меня есть DataGridView. Что я хочу сделать, это взять данные, которые возвращаются из запроса и отобразить их в DGV. Однако, когда я делаю это, он отображает все 35 столбцов в базе данных, а не 10, которые я выбрал (однако, десять - единственные, в которых есть данные ... так что это в основном таблица с кучей пустых столбцов).

Мое текущее, не элегантное решение состоит в том, чтобы вернуть запрос в DataTable, а затем перебрать столбцы таблицы, удаляя тот, который мне не нужен. Это не надежно, эффективно, и мне не нравится удалять столбец первичного ключа.

Мой ТА предложил попробовать использовать нетипизированную привязку данных ... он сказал, что это должно отображать только те данные, которые я извлекаю, но никто из нас еще не смог выяснить это.

Спасибо!

UPDATE

Я не уверен, что вы подразумеваете под страницами .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, для которого не выбран источник данных, выбранный при загрузке

Ответы [ 2 ]

1 голос
/ 03 ноября 2008

Если вы создаете страницы с помощью тегов, вам понадобится следующий код на странице ...

<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
1 голос
/ 03 ноября 2008

Я предполагаю, что вы используете формы 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
...