Query su bindingsource

martedì 23 dicembre 2008 - 21.26

fabi2089 Profilo | Junior Member

salve a tutti si puo effettuare una query per selezionar dati con bindingsource... grazie a tutti

Teech Profilo | Expert

Se usi un DataTable (o un oggetto "filtrabile") di base per il BindingSource puoi filtrare su questo e riaggoirnare il BingingSource stesso (pseudocodice):
BindingSource.DataSource=DataTable BindingSource.DataSource=Collection '.... Fai altro poi filtri il BindingSource attraverso la collection di base... BindingSource.DataSource=DataTable.Select(StringaLogica) BindingSource.DataSource=Collection.Filter(StringaLogica)
Se vuoi filtrare perchè il BindingSource è popolato da una tua collection o comunque un oggetto non "filtrabile" devi crearti a mano le logiche per filtrare... Puoi guardare le interfacce che implementa il DataTable per filtrare e prendere come spunto quelle (al volo non le ricordo, eventualmente dopo ci guardo con più calma).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

fabi2089 Profilo | Junior Member

scusa la mia ignoranza ma la collection è un insieme di tabelle..?
come faccio a farla??? ti ringrazio anticipatamente...

Teech Profilo | Expert

La collection è un insieme di oggetti... Il DataTable è una collection di DataRow ad esempio.
Per crearti la tua collection personalizzata devi ereditare da un oggetto collection (ce ne sono diversi). Tipicamente le collection più semplici sono basate su delle List o Array di oggetti ma esistono anche collection più complesse come le HashTable ed i Dictionary.
Personalmente, quando posso, eredito da BindingList e creo delle collection tipizzate:
Public Class MiaCollection Inherits BindingList(Of MiaClasse) ...
Ti anticipo che se vuoi gestire i filtri su una tua collection è un lavoro piuttosto articolato ma ti permette una grossa flessibilità.

Se invece stai lavorando con dei DataTable effettua i filtri su quello ed avrai lo stesso risultato con uno sforzo decisamente minore: come dicevo i DataTable sono già delle collection di oggetti non tipizzati (i DataRow).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

fabi2089 Profilo | Junior Member

ma con datatable posso prendere anche piu tabelle??

Teech Profilo | Expert

No. Il DataTable è la "proiezione in memoria di una vista". Per avere più tabelle devi usare un DataSet (che è una collection di DataTable) e relazionare le varie tabelle con dei DataRelation all'interno del DataSet. A quel punto puoi crearti delle DataView all'interno del Dataset e usare quelle per il BindingSource. Come avrai capito è un processo un po' complesso, ma per aiutarti puoi creare delle DataTable e popolarle con delle Query (se usi Access) o delle Stored Procedure (se usi SQL) e gestire direttamente i dati sui DataTable.

Qual'è il tuo scopo reale di questa applicazione? Dove hai il problema? Forse riesco ad essere meno astratto
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

fabi2089 Profilo | Junior Member

devo effettuare una databinding su una datagridview. Nel mio form è presente un bindingnavigator che scorre gli id della tabella ordini, io dovrei visualizzare gli articoli di ogni ordine attraverso la datagridview.
Ho provato a mettere l'id in una text e richiamare una funzione aggiorna, che attraverso una query il cui idordine lo prendo dalla text.La funzione mi aggiorna la datagridview attraverso dataset -> dataadapter, tuttavia la dataridview non risponde immediatamente ai pulsanti next e previous del bindingnavigator. Nel senso che quando schiacchio il tasto next la datagridview si aggiorna ma con l'id precedente.
Hai un idea su come fare.

P.S.
il database è formato da una tabella ordini, una articoli e una che relaziona articoli con ordini.

grazie mille..

Non so se sono stato chiaro nella spiegazione.

Teech Profilo | Expert

Da quello che capisco vuoi creare una form Master/Details... Di seguito alcuni esempi di come fare:
http://forum.masterdrive.it/articoli-visual-basic-net-36/soluzioni-aggiornamento-in-form-master-detail-21692/
http://msdn.microsoft.com/it-it/library/y8c0cxey.aspx
http://community.visual-basic.it/lucianob/archive/2007/06/22/19710.aspx
http://www.java2s.com/Code/CSharp/Database-ADO.net/ADONETBindingMasterDetail.htm

Le idee possono essere migliaia... Buona lettura, e se hai domande chiedi pure...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

fabi2089 Profilo | Junior Member

ma posso effettuare una query su datamember della bindingsource??

Teech Profilo | Expert

In che senso?
Se il DataSource del BindingSource è un Dataset il DataMenber è un DataTable o un DataView del Dataset stesso. Quindi la domanda è se puoi effettuare una query su un DataTable? Se leggi il mio primo post ho specificato che puoi usare il metodo Select del DataTable...
Per effettuare un form Master/Details però ci sono delle tecniche ben collaudate che ti ho postato sopra: ti consiglio di vedere quelle.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

fabi2089 Profilo | Junior Member

provo ad utilizzare select si datatable ma non mi filtra i dati.

mi puoi spiegare cortesemente come si usa datatable.select(.........)... grazie mille

Teech Profilo | Expert

Dipende da come è strutturato il tuo DataTable e da quello che vuoi esattamente ottenere:
http://msdn.microsoft.com/it-it/library/system.data.datatable.select(VS.80).aspx

Poniamo che hai una DataColumn nel DataTable denominata "Codice" di tipo String puoi scrivere:
Dim r() As DataRow=DataTable.Select("Codice='123'")
e ti popolerà l'array r() con tutti i DataRow del DataTable che soddisfano la condizione.

Per fare ciò che vuoi tu puoi impostarti una DataView e popolarlo con il risultato della DataTable.Select(). Imposti il DataView come DataSource del tuo controllo ed il gioco è fatto: aggiorni il DataView con la DataTable.Select che preferisci e riassegni il DataSource del controllo tutte le volte (è necessario farlo, non so perchè).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

zirc75 Profilo | Newbie

Ciao

mi aggancio al thread:

tramite bindinglist vorrei fare dei filtri dinamici (parametrici), quindi mybindinglist.where... oppure mybindinglist.orderby...
la bindinglist è il datasource di una datagridview.

Quando eseguo l'ordinamento ed il where sul bindinglist, la griglia aggiorna i propri dati?
E' possibile trasferire i dati di una datatable nel bindinglist evitando un for each?

Saluti

Carlo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5