2009-11-17 8 views
3

J'ai donc un dataGridView et une zone de texte sur un formulaire. Je veux être en mesure de rechercher dans le fichier dataGridView et le trier par rapport à la chaîne dans la zone de texte. ex: Je tape "acv" dans la zone de texte et toutes les chaînes contenant "acv" sont triées en haut. J'accomplis cela avec un tas de gymnastique impliquant datatable.select et un peu de compensation et de remplissage mais c'est moche et lent. Quelle serait la meilleure pratique/bonne/façon normale de faire cela?vb.net dataTable/DataGridView recherche/tri

+0

Quel est le nombre maximal de lignes contenues dans le datatable? – overslacked

+0

pas de maximum, mes données de test contiennent environ 7500+ lignes. pourrait être jusqu'à 50k. – Jacob

+0

Utilisez-vous un serveur de base de données, ou provient-il d'un fichier XML, ou ...? – overslacked

Répondre

3

Utilisez un DataView filtré puis mis BindingSource de votre DataGridView au Filtré DataView. Si l'utilisateur efface la condition de filtre, rétablissez simplement BindingSource à votre vue par défaut d'origine. Je vous recommande de stocker la vue avant le tri afin que vous puissiez facilement revenir à la vue d'origine. Je l'utilise maintenant pour trier rapidement et cela fonctionne très bien. Remplacez les noms de colonnes par les vôtres. Vous devriez être en mesure de modifier l'aperçu de données à partir du DataGridView d'origine et appliquer le filtre sans re-liaison. Il suffit de lier votre DataGridView à un DataView au début, puis de récupérer le DataView (c'est-à-dire DataSource) et de le modifier. Je ne suis pas sûr si vous utilisez un BindingNavigator ou non. Bonne chance.

Dim myDataTable As DataTable = myDataSet.Tables(0) 
Dim myDataView As New DataView(myDataTable) 

myDataView.RowFilter = "CompanyName LIKE '%" & ddlAlpha.SelectedItem.Text & "%'" 
myDataView.Sort = "ContactName" 
dataGridView1.DataSource = myDataView 
dataGridView1.DataBind() 
0

Jetez un coup d'œil à this tutorial. J'ai utilisé la même idée de filtrage de table en utilisant jQuery et ça a très bien marché pour moi. Voici ce que je:

$(document).ready(function() 
{  
$('#filter').keyup(function(event) 
{ 
    //if esc is pressed or nothing is entered   
    if (event.keyCode == 27 || $(this).val() == '') 
    { 
     //if esc is pressed we want to clear the value of search box 
     $(this).val(''); 

     //we want each row to be visible because if nothing 
     //is entered then all rows are matched. 
     $('tbody tr').removeClass('visible').show().addClass('visible'); 
    } 
    else 
    { 
     // drill down and find the ONE table out of many. 
     var theTable = $('div.rgDataDiv').find('table.rgMasterTable').find('tbody tr'); 

     //if there is text, lets filter 
     filter(theTable, $(this).val()); 
    } 
});  
}); 


//filter results based on query 
function filter(selector, query) 
{ 
query = $.trim(query); //trim white space 
query = query.replace(/ /gi, '|'); //add OR for regex 

$(selector).each(function() 
{ 
    ($(this).text().search(new RegExp(query, "i")) < 0) ? $(this).hide().removeClass('visible') : $(this).show().addClass('visible'); 
}) 
}