问题描述
我正在学习使用高级 DataGridView,但在数据表上执行 .Select()
后更新 DataGridView 时遇到问题。我在 .RowFilter
上找到了很多 SO 帖子,并且已经开始使用,但我在 .Select()
上运气不佳。
我发现 this SO post 指出 .Select()
更适合较大的表,因此尝试使用 .Select()
我的印象是,如果数据表绑定到绑定源,那么它应该自动更新 DataGridView,但情况似乎并非如此。
当我通过时,我可以看到:
DaTarow[] test = dataTable.Select("foundTerm = 'cat' OR foundTerm = 'dog'");
test
对象现在具有正确的行数,这很好,但是我似乎错过了如何更新 DataGridView 的最后一步,而且我还没有在搜索中找到答案.
到目前为止,我有以下几点:
private void searchButton_Click(object sender,EventArgs e)
{
dataTable = new DataTable();
bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;
// COLUMNS ADDED TO DATATABLE
// DATA ROWS ADDED TO DATATABLE
}
advancedDataGridView1.DataSource = dataTable;
}
private void advancedDataGridView1_FilterStringChanged(object sender,Zuby.ADGV.AdvancedDataGridView.FilterEventArgs e)
{
DaTarow[] test = dataTable.Select("foundTerm = 'cat' OR foundTerm = 'dog'");
advancedDataGridView1.Refresh();
advancedDataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.displayedCells;
bindingSource.ResetBindings(false);
advancedDataGridView1.Update();
dataTable.AcceptChanges();
}
感谢任何和所有帮助/方向。
解决方法
你的尝试是行不通的; select 返回一个 DataRow 集合,但绝对不会改变 datagridview 显示的数据
也许一个不同的例子会有所帮助
textBox1.Text = "Hello world";
var s = textBox1.Text.Substring(0,5);
你希望 s 包含什么?您希望文本框显示什么?
答案:
s is "Hello"
Textbox shows "Hello world"
Select 为您提供符合某些条件的行集合,但出于同样的原因,datagridview 将继续显示整个数据表内容。 BindingSource 与此无关,只是传递数据
我建议您只进行此设置,以便“datagridview 绑定到 bindingsource 绑定到数据表”并使用绑定源的 RowFilter。从用户的角度来看,您不应该向用户提供如此庞大的数据集,以至于该古老的 SO 帖子中的任何建议方法(链接到也是垃圾的 MSDN 文章,顺便说一句)有任何不同
头脑正常的人不会将一百万行加载到数据表中,然后找到最快的方法让 c# 找到用户感兴趣的一(或十)行;他们会编写一个 SQL SELECT 查询,在数据库中留下 999,990 行并传输 10 行所需的行;移动近一百万行不需要的行的网络时间大大超过在客户端浏览它们所需的时间