Vb griglia (datagridview?) con filtri sui campi

martedì 19 aprile 2011 - 17.13
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Windows XP  |  Visual Studio 2010  |  SQL Server Express

sansi Profilo | Newbie

Buongiorno a tutti, volevo chiedere un consiglio su come risolvere un mio problema.
Per visualizzare i dati estratti da un database attualmente utilizzo una datagridview a cui assegno una datatable con i dati estratti dal database come datasource. Per filtrare i dati ho predisposto alcune textbox e creo la query di selezione utilizzando i valori inseriti in esse. Questo sistema ora sta mostrando la corda perché le colonne da visualizzare cominciano a essere tante e vorrei rendere la cosa più flessibile per l'utente (creare una textbox per ogni colonna è improponibile), quindi mi piacerebbe che in testa alla griglia ci fosse una riga vuota con gli stessi campi della datagridview in cui inserire i valori da filtrare come ho visto fare in molti software gestionali, solo che non ho idea di come procedere. La datagridview è lo strumento giusto per fare questo? Inizialmente pensavo di creare una riga nuova vuota e poi popolare la griglia manualmente da codice a partire dalla seconda riga ma non vorrei rinunciare al binding perché mi è molto utile per postare le modifiche al db, inoltre in questo modo dovrei inibire l'ordinamento da parte dell'utente.
Spero di essere stato abbastanza chiaro.

Utilizzo Visual Studio 2010 prof. su Windows 7 e database sql server express 2008

Ringrazio anticipatamente chiunque vorrà aiutarmi.

Massimo

darkeric Profilo | Senior Member

Come ricerca potresti utilizzare una sola textbox e una label

quando l'utente clicca sulla riga che vuole filtrare modifichi il valore della label per far capire cosa si stà filtrando
si inserisce il testo e appena si da invio esegui una query assegnando il valore della textbox al parametro di riferimento

Programmatore per passione non per professione!

sansi Profilo | Newbie

>Come ricerca potresti utilizzare una sola textbox e una label
>
>quando l'utente clicca sulla riga che vuole filtrare modifichi
>il valore della label per far capire cosa si stà filtrando
>si inserisce il testo e appena si da invio esegui una query assegnando
>il valore della textbox al parametro di riferimento
>
>Programmatore per passione non per professione!

Grazie per la risposta ma facendo così posso filtrare solo una colonna per volta. Invece quello che vorrei fare è dare la possibilità all'utente di inserire filtri da 1 a tutte le colonne, volendo.

Massimo

darkeric Profilo | Senior Member

>Grazie per la risposta ma facendo così posso filtrare solo una
>colonna per volta. Invece quello che vorrei fare è dare la possibilità
>all'utente di inserire filtri da 1 a tutte le colonne, volendo.
>
>Massimo

potresti provare a nascondere le righe della grid senza passare per una query a seconda dei parametri inseriti,
magari con una textbox posizionata sopra ogni colonna
però dipende da quante righe ci sono nella grid poichè potrebbe risultare lenta come operazione!
Programmatore per passione non per professione!

sansi Profilo | Newbie


>
>potresti provare a nascondere le righe della grid senza passare
>per una query a seconda dei parametri inseriti,
>magari con una textbox posizionata sopra ogni colonna
>però dipende da quante righe ci sono nella grid poichè potrebbe
>risultare lenta come operazione!
>Programmatore per passione non per professione!

In realtà il mio problema non è come effettuare la query oppure se fare una select sul dataset ma è proprio come mettere a disposizione gli n campi delle colonne senza usare n textbox per diverse ragioni:
la prima è che avendo una trentina di colonne dovrei avere una trentina di textbox, la seconda è che avendo dato all'utente la possibilità di rendere visibili oppure no alcune colonne risulterebbe difficile gestire le textbox e la terza è che se ridimensiono le colonne mi si sballa l'incolonnamento delle textbox.

Grazie comunque per il suggerimento.

Massimo

sansi Profilo | Newbie

RISOLTO

Alla fine l'ho risolto in questo modo, forse non sarà il "massimo" ma sembra funzionare. Lo scrivo così se serve ad altri...

Ho utilizzato due datagridview sovrapposte. La prima che chiamo grdFiltri e la seconda che chiamo grdDati. La seconda viene associata a un datasource e al caricamento del form creo le colonne della grglia dei filtri copiando le colonne dalla seconda in questo modo:

Private Sub CreaColonne() Dim nr As Integer, i As Integer grdFiltri.Width = grdDati.Width nr = grdDati.Columns.Count For i = 0 To nr - 1 grdFiltri.Columns.Add(grdDati.Columns(i).Name, grdDati.Columns(i).HeaderText) grdFiltri.Columns(i).Width = grdDati.Columns(i).Width grdFiltri.Columns(i).Visible = grdDati.Columns(i).Visible Next grdFiltri.Rows.Add() End Sub

A questo punto ho il problema di sincronizzare le due griglie:
intercetto gli eventi resize e ColumnWidthChanged di entrambe le griglie e con i dati nuovi di una aggiorno l'altra

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Naturalmente ho impostato la proprietà ColumnsHeaderVisible della grtdDati a False in modo che si veda solo quella dei filtri.

A questo punto non devo far altro che scorrere la riga dei filtri per vedere se l'utente ha inserito qualcosa. Sembra che funzioni.

Grazie ancora,
Massimo
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5