windows phone 中 textBox1_TextChanged 的性能变慢
Posted
技术标签:
【中文标题】windows phone 中 textBox1_TextChanged 的性能变慢【英文标题】:getting slower performance in textBox1_TextChanged in windows phone 【发布时间】:2013-12-12 06:34:05 【问题描述】:我的应用中有一个搜索文本框。在我的数据库中有两列名为 English 和 Bangla。我可以搜索孟加拉语或英语。搜索文本框旁边有一个按钮。默认情况下,英文搜索已激活。我可以通过单击按钮更改搜索选项。它工作正常,但问题是搜索速度很慢。 点击按钮搜索选项选择代码为:
private void button5_Click(object sender, RoutedEventArgs e)
if (SearchMood % 2 != 0)
//search bangla column from the database
button5.Content = "Eng";
else
//search english column from the database
button5.Content = "Bng";
SearchMood++;
搜索代码为:
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
List<dataLists> mylist = new List<dataLists>();
string word = textBox1.Text;
try
if (SearchMood % 2 == 0)// for english search
// show 5 words in listbox matched with entered text
var contacts = (from m in db.Dics where m.English.StartsWith(word) select new m.English, m.Bangla ).Take(5);
string s1, s2;
try
foreach (var a in contacts)
s1 = a.English;
s2 = a.Bangla;
mylist.Add(new dataLists() Eng = s1, Bng = s2 );
catch (Exception ex) MessageBox.Show(ex.ToString());
listBox1.ItemsSource = mylist;
else // for bangla search
// show 5 words in listbox matched with entered text
var contacts = (from m in db.Dics where m.Bangla.StartsWith(word) select new m.English, m.Bangla ).Take(5);
string s1, s2;
try
foreach (var a in contacts)
s1 = a.English;
s2 = a.Bangla;
mylist.Add(new dataLists() Eng = s1, Bng = s2 );
catch (Exception ex) MessageBox.Show(ex.ToString());
listBox1.ItemsSource = mylist;
catch
如何提高搜索性能???任何人都可以提供任何解决方案|???
N:B:我的表创建脚本看起来像
public System.Data.Linq.Table<Dic> Dics
get
return this.GetTable<Dic>();
public System.Data.Linq.Table<Learn_table> Learn_tables
get
return this.GetTable<Learn_table>();
[global::System.Data.Linq.Mapping.TableAttribute(Name="dic")]
public partial class Dic : INotifyPropertyChanging, INotifyPropertyChanged
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _Serial;
private string _English;
private string _Bangla;
private System.Nullable<int> _Fav;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnSerialChanging(int value);
partial void OnSerialChanged();
partial void OnEnglishChanging(string value);
partial void OnEnglishChanged();
partial void OnBanglaChanging(string value);
partial void OnBanglaChanged();
partial void OnFavChanging(System.Nullable<int> value);
partial void OnFavChanged();
#endregion
public Dic()
OnCreated();
[global::System.Data.Linq.Mapping.ColumnAttribute(Name="serial", Storage="_Serial", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int Serial
get
return this._Serial;
set
if ((this._Serial != value))
this.OnSerialChanging(value);
this.SendPropertyChanging();
this._Serial = value;
this.SendPropertyChanged("Serial");
this.OnSerialChanged();
[global::System.Data.Linq.Mapping.ColumnAttribute(Name="english", Storage="_English", DbType="NVarChar(2000)")]
public string English
get
return this._English;
set
if ((this._English != value))
this.OnEnglishChanging(value);
this.SendPropertyChanging();
this._English = value;
this.SendPropertyChanged("English");
this.OnEnglishChanged();
[global::System.Data.Linq.Mapping.ColumnAttribute(Name="bangla", Storage="_Bangla", DbType="NVarChar(2000)")]
public string Bangla
get
return this._Bangla;
set
if ((this._Bangla != value))
this.OnBanglaChanging(value);
this.SendPropertyChanging();
this._Bangla = value;
this.SendPropertyChanged("Bangla");
this.OnBanglaChanged();
[global::System.Data.Linq.Mapping.ColumnAttribute(Name="fav", Storage="_Fav", DbType="Int")]
public System.Nullable<int> Fav
get
return this._Fav;
set
if ((this._Fav != value))
this.OnFavChanging(value);
this.SendPropertyChanging();
this._Fav = value;
this.SendPropertyChanged("Fav");
this.OnFavChanged();
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void SendPropertyChanging()
if ((this.PropertyChanging != null))
this.PropertyChanging(this, emptyChangingEventArgs);
protected virtual void SendPropertyChanged(String propertyName)
if ((this.PropertyChanged != null))
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
【问题讨论】:
【参考方案1】:您的问题出现在使用TextChanged
事件处理程序。在那里放置一个断点,你会看到它触发了两次,从而导致你的性能变慢。这似乎是 WP7 TextBox
控件中的一个错误。
使用KeyUp
事件处理程序,而不是textBox1_TextChanged
void textBox1_KeyUp(object sender, KeyEventArgs e)
//your code
希望这能解决您的问题。 !!
【讨论】:
【参考方案2】:您可以使用 AutoCompleteBox 而不是使用 TextBox。 Microsoft.Phone.Control.Toolkit 中提供了 AutoCompleteBox。 当您在 buttonClick 上选择语言并将查询结果分配给 AutoCompleteBox.Itemsource 时,立即执行您选择查询。它应该真正提高搜索性能。
<toolkit:AutoCompleteBox x:Name="AutoBoxFood" Width="440" SelectionChanged="txtFodd_SelectionChanged" FilterMode="StartsWith" HorizontalAlignment="Left" Height="70"/>
【讨论】:
但是我必须在我用来显示搜索结果的列表框的每一行中实现 2 个按钮操作。 @Jaihind【参考方案3】:为数据库文件中的列添加索引。
【讨论】:
我的表名是 'dic',我发现 itz 索引名是 PK_dic。我在我的代码中查询了 var contacts = (from m in db.Dics where m.English.StartsWith(word) select new m.English, m.Bangla ).Take(5);现在我需要做什么?? @ErikEJ 我使用了现有的数据库。这是完整的架构dropbox.com/s/r0dcpdpkoloq8gn/mydatabase.cs 当我用 "SELECT * FROM INFORMATION_SCHEMA.INDEXES" 查询时,我发现我的 "dic" 表的 index_name 是 "PK_dic" 。你有什么解决办法吗?? @ErikEJ 你需要将文件复制到桌面并添加索引,或者至少使用我的工具创建一个CREATE TABLE语句,显示代码没有帮助。 我用你的工具来使用现有的数据库以上是关于windows phone 中 textBox1_TextChanged 的性能变慢的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Windows Phone 8 SDK 将类序列化为 XML?
window.open链接未在Windows Phone 8的cordova应用中打开