I have implemented Auto Complete drop down list in WPF
It is giving issues when a large data (say over 30 MB) is bind to it
What is the best ap开发者_开发问答proach to work on large data (Operations like Searching)
Is it possible to serialize 30 MB data and as User type in Autocomplete Drop Down List, Search
in to serialized data and attach resulting data to Drop Down List and show it to the User
Please suggest...
Usually you should put time-consuming operations in BackgroundWorker.DoWork event handler not setting controls properties as above. if you want to set a property of control which have been created in another thread in BackgroundWorker.DoWork event handler then you should use Control.Invoke method to set properties asynchronously. nevertherless following code is better solution:
toolStripStatusLabel1.Text = "Loading ... ";
enter code here` backgroundWorker1.RunWorkerAsync();
enter code here`backgroundWorker1_DoWork(/*arguments*/)
{
// getting data from database and fill dataset
}
backgroundWorker1_RunWorkerCompleted(/*arguments*/)
{
dt_kh = ds.Tables[0];
cboMaKH.DataSource = ds.Tables[0];
cboMaKH.DisplayMember = "MaKH";
cboMaKH.ValueMember = "MaKH";
cboTenCty.DataSource = ds.Tables[0];
cboTenCty.DisplayMember = "TenCty";
cboTenCty.ValueMember = "TenCty";
cboMaKH.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cboMaKH.AutoCompleteSource = AutoCompleteSource.CustomSource;
cboMaKH.AutoCompleteSource = AutoCompleteSource.ListItems;
cboTenCty.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cboTenCty.AutoCompleteSource = AutoCompleteSource.CustomSource;
cboTenCty.AutoCompleteSource = AutoCompleteSource.ListItems;
txtTenKH.DataBindings.Add("Text", ds.Tables[0], "TenKH");
txtDiaChi.DataBindings.Add("Text", ds.Tables[0], "Diachicty");
txtDienThoai.DataBindings.Add("Text", ds.Tables[0], "DienThoaiCty");
txtTaiKhoan.DataBindings.Add("Text", ds.Tables[0], "TaiKhoanCty");
txtVIMST.DataBindings.Add("Text", ds.Tables[0], "MSTCty");
}
Is your autocomplete textbox using ICollectionView.Filter
to search values?
If yes then it is bound to be slow for large data sets being synchronous.
Use PLINQ to your advantage.
When a user types a text in the textbox, perform the PLINQ query to entries that start with \ contain the text that is typed, and then rebind the itemssource after the PLINQ query returns.
If you cant use PLINQ or dont have .Net 4.0, then perform the simple LINQ search on a different thread and rebind over the Dispatcher
of the autocomplete box.
精彩评论