所以我在表单上有一个dataGridView和一个文本框。我希望能够搜索dataGridView并将其与文本框中的字符串进行排序。例如: 我在文本框中键入“acv”,所有包含“acv”的字符串都排在最前面。 我正在通过一系列涉及datatable.select和一些清理和填充的体操来完成这项任务,但它很丑陋而且很慢。这样做的最佳做法/正确/正常方式是什么?
答案 0 :(得分:3)
使用过滤的DataView,然后将DataGridView的BindingSource设置为Filtered DataView。如果用户清除过滤条件,则只需将BindingSource设置回原始默认视图即可。我建议您在排序之前存储视图,以便您可以轻松地返回原始数据视图。我现在用它来快速排序,效果很好。用您的列名替换列名。您应该能够从原始DataGridView修改数据视图并应用过滤器而无需重新绑定。只需在开始时将DataGridView绑定到DataView,然后检索DataView(即DataSource)并进行修改。我不确定你是否使用BindingNavigator。祝你好运。
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()
答案 1 :(得分:0)
看看this tutorial。我使用jQuery的表过滤的相同想法,它对我来说非常好。这是我使用的:
$(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');
})
}