2011-12-27 11 views
3

私はツールキット(VS 2008)を介してオートコンプリートボックスを持つWPFアプリケーションを持っています。私は約2000レコードの潜在的な人口を持っています。私は、ポピュレートするイベントプロシージャの組み合わせでパフォーマンスを向上させようとしました。矛盾した結果が出ています。フィルタはOKだと思われますが、私はそのアプリケーションを一度実行することができ、結果Xはそこにありますが結果は残っていません。それをやり直すことで結果YをXにすることができます。その後XとYの両方がそこにあります。これは初めてオートコンプリートボックスを使用するので、私のコードで何かでなければならないと確信しています忘れている。 Itemsourceバインディングの直前に結果セットをチェックすると、目的の結果が表示されますが、ユーザーには表示されません。ドロップダウンのオートコンプリートバックは表示されません。多分私はイベントのオーバーライドを必要とする???オートコンプリートボックス - 母集団からの一貫性のない値

XAML

<input:AutoCompleteBox       
Name="autGlobal" 
FilterMode="Contains" 
Style="{DynamicResource MiniSearchAutoBoxWPF}" 
IsTextCompletionEnabled="false" 
Margin="5, 0, 5, 0" 
HorizontalAlignment="Center" 
KeyUp="autGlobal_KeyUp" 
Text="Search Term" 
GotFocus="autGlobal_GotFocus" 
ValueMemberPath="Item" 
Populating="AutoCompleteBox_Populating" 
> 

方法

private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e) 
      { 
      e.Cancel = true; 
      var b = new BackgroundWorker(); 
      currSearch = autGlobal.Text; 
      b.DoWork += b_DoWork; 
      b.RunWorkerCompleted += b_RunWorkerCompleted; 
      b.RunWorkerAsync(autGlobal.Text); 
     } 

private void b_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Results.Clear(); 
      int counter = 0; 
      string search = e.Argument.ToString(); 
      search = search.ToUpper(); 
      foreach (GlobalSearchList person in myGlobalList) 
      { 
       if (person.Item.ToUpper().Contains(search)) 
       { 
        Results.Add(person); 
        counter++; 

        if (counter >= MAX_NUM_OF_RESULTS) 
        {       
         break; 
        } 
       } 
      } 
     } 

private void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 

      if (this.Dispatcher.Thread == System.Threading.Thread.CurrentThread) 
      { 
       //Set the source 
       if (currSearch == autGlobal.Text) 
       { 
        autGlobal.ItemsSource = Results; 
        autGlobal.PopulateComplete(); 
       } 
      } 
      else 
      { 
       this.Dispatcher.Invoke(new Action(() => 
       { 
        //Set the source 
        if (currSearch == autGlobal.Text) 
        { 
         autGlobal.ItemsSource = Results; 
         autGlobal.PopulateComplete(); 
        } 

       })); 
      }    
     } 
+0

この状態は何かしているようです... "counter> = MAX_NUM_OF_RESULTS" ..私はそれがいくつかのレコードを防ぐと思います.. – Bathineni

答えて

3

コントロールのプロパティ。同様のことが、オートコンプリートボックスが行うべきことです。

コントロールを10000文字列のリストにバインドしようとしましたが、これは完璧に動作します。そのため、コレクションに入れているオブジェクトのサイズが問題になる可能性があります。 1つの解決法は単なる文字列表現を使用することができ、選択されたオブジェクトが必要なときは、その表現に基づいてそれを見つけることができます。

このアプローチの主な問題の1つはスレッドのシンクロナイゼーションです。ここでは、フィルタがうまくいっても結果の項目が正しくない場合の超自然の動作を説明します。

フィルタは正常だと思われますが、私はそのアプリケーションを一度実行することができ、結果Xは になりますが、結果はありません。これが開始されます、あなたはオートコンプリートボックスに「AB」を書くと仮定し

など、など、結果Yが そこではなくXも作ることができ、その後の時間XとYの両方があるだろうそれを再度 実行この検索が実行される新しいBackGroundWorkerあなたが十分に長く待っていると、すべてがうまくいくはずです。しかし、最初の作業者が終了する前に検索クエリを変更すると、すべての結果が混在します。たとえば、次のコード行を参照してください。

// the user searchs for "ab" 
[Thread 1] Results.Clear(); 
[Thread 1] Results.Add(Item[1]); 
[Thread 1] Results.Add(Item[2]); 
... 
// the user changes the search term (to "abc" for example) 
[Thread 2] Results.Clear(); 
[Thread 2] Results.Add(Item[3]); 
// but what would happen if the first BackGroundWorker hasn't finished yet, 
// this means that the first thread is still running 
[Thread 1] Results.Add(Item[5]); // this items doesn't match the second search 
[Thread 1] Results.Add(Item[6]); // criteria, but are added to the collection 
[Thread 2] Results.Add(Item[7]); 
// then you'll have two treads adding items to the Result collection 
[Thread 1] Results.Add(Item[2]); 
... 
[Dispatcher Thread] autGlobal.ItemsSource = Results; 
[Dispatcher Thread] autGlobal.PopulateComplete(); 

希望することができます。

0

たぶん、あなたは、このいずれかをチェックすることができます。 すべての作業が完了しました。私はあなたが最初の場所でパフォーマンスの向上を必要とする理由、あなたは別のスレッドでオートコンプリート・ボックスであるべき要素を計算し、その後ItemsSourceに割り当てるしようとしているかわからない

http://gallery.expression.microsoft.com/WPFAutoCompleteBox/

関連する問題