2008-11-03 17 views
0

Je fais la programmation .NET 3.5 en VB pour une classe. J'ai une base de données .mdb avec 3 tables connexes, et un adaptateur de table avec des requêtes sur ce qui ressemblent à ceci:Affichage des colonnes sélectionnées

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

ensuite sous une forme que j'ai un DataGridView. Ce que je veux faire est de prendre les données qui sont renvoyées de la requête et l'afficher dans la DGV. Cependant, quand je fais cela, il affiche toutes les 35 colonnes de la base de données, pas les 10 que j'ai sélectionnées (les dix sont les seules qui contiennent des données ... donc c'est essentiellement une table avec un tas de colonnes vides).

Ma solution actuelle, inélégante est de renvoyer la requête à un DataTable, puis parcourir les colonnes de la table, en supprimant celui que je ne veux pas. Ce n'est pas robuste, efficace, et ne m'aime pas supprimer la colonne clé primaire. Mon TA a suggéré d'essayer d'utiliser une liaison de données non typée ... il a dit que cela devrait afficher uniquement les données que je tire, mais aucun d'entre nous n'a été capable de comprendre cela pour le moment.

Merci!

MISE À JOUR

Je ne sais pas ce que vous entendez par les pages .aspx/.aspx.vb, mais c'est le code de requête que j'ai de l'adaptateur de table

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) 

et voici où je l'utilise dans le code:

Public Sub getRent() 
     propView.DataSource = TblPropertiesTableAdapter.GetAllRentReceipts() 
     propView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells) 
     propView.ReadOnly = True 
    End Sub 

propView est un DataGridView qui ne dispose pas d'une source de données sélectionnée à la charge

+0

Vous travaillez sur une application Web ou une application de bureau? – Keith

+0

application de bureau –

Répondre

1

Je suppose que vous utilisez des formulaires Windows et un DataGridView avec AutoGenerateColumns activé.

Si vous ajouter vos propres colonnes seulement celles que vous sélectionnez apparaissent:

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

Si vous construisez les pages à l'aide des balises, vous voulez que le code suivant dans la page ...

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

Si bien vous voulez utiliser le code pour la couche de données, vous pouvez utiliser quelque chose le long des lignes de ce qui suit ...

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 

Si vous utilisez une connexion OLEDB, cette fonction peut être modifiée comme suit (ce qui signifie que vous suffit de changer une fonction de mise à jour chaque utilisation de celui-ci dans l'application - nice)

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 

Cette fonction est un générique couche de données qui prendra n'importe quelle commande SQL et affichera les données dans un DataTable, qui peut simplement être lié à une vue de grille ou similaire. Vous pouvez vérifier que la "requête" ne sélectionne que les colonnes que vous voulez mais en déboguant le code et en vérifiant la commande SQL à votre base de données. Je voudrais le construire dans une classe afin que n'importe quelle page puisse y accéder pour charger des données dans une table de données.

Votre code deviendrait

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 
+0

Vous devez Disposer vos instances SqlCommand et SqlConnection. – Keith

+0

True - J'ai essayé de coller du code à partir d'une classe de données plus complexe. La façon la plus simple et la plus claire de le faire est d'utiliser l'instruction Using. Je vais mettre à jour le code. – digiguru

+0

J'aime cette solution car elle présente une robustway de générer la vue, mais j'ai du mal à la faire fonctionner. VS dit que: "La configuration n'est pas membre de System.Web" Ma base de données est un fichier .mdb d'accès dans mon répertoire de projets, mais j'ai des problèmes pour l'analyser dans une chaîne de connexions. –

Questions connexes