2012-02-28 58 views
3

我想實現在一個陣列,顯示在單字符輸入建議的形式的自定義數據源的文本框自動完成。但是當我運行程序時,自動完成只在第二個字符輸入後啓動。當我調試時,我看到數據在AutoCompleteNameCollection中,但直到第二個字符輸入時才顯示在建議中。文本框自動完成不能正常工作

這段代碼我已經寫在textchange事件。

arr = LoadName(empid_txt.Text.Trim()); //arr is string array       
namesCollection.AddRange(arr); 
this.empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; 
this.empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; 
this.empid_txt.AutoCompleteCustomSource = namesCollection; 

在LoadEvent中,我用一個空數組初始化了AutoCompleteNameCollection。

namesCollection.AddRange(arr);// here arr is empty 
empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; 
empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; 
empid_txt.AutoCompleteCustomSource = namesCollection; 

但它不工作,直到第二個字符輸入。 但是,如果不是數組,我用一個空字符串初始化AutoCompleteNameCollection,如:namesCollection.Add(「」);它對單個字符輸入起作用,但有時會出現AccessViolationException:試圖讀取或寫入受保護的內存。 那麼有什麼辦法可以解決這個問題嗎?

回答

1

在載入時,您可以使用數據的子集填充TextBox(可以將其緩存以供將來/共享使用)。如果你有一個「最常見」的計數器,你可以使用它。作爲限制條件,你甚至可以添加一個虛擬項目(如果你得到一個空字符串是一個訪問衝突)。 然後,在TextChange事件中從數據庫中讀取您需要的數據。

我只有一個問題:在用戶開始鍵入之前,您不想填充源代碼?如果存在網絡流量問題,那麼您會移動大量數據。如果你移動了大量數據,那麼你的用戶在開始輸入內容時將不得不等待。可以接受嗎?另一方面,如果他們沒有太多的等待,那麼數據流可能不是那麼大,你可以在表單的構造函數中(或者在那個時間不遠)將該邏輯放入BackgroundWorker

0

如果「改編」是空的,當你初始化文本框,然後沒有什麼可比較的對象。在開始輸入之前,您必須將AutoCompleteCustomSource初始化爲有效數組。當用戶已經鍵入一個字符時,您正在textchange事件中進行初始化。

您需要的代碼改變之前填充namesCollection - 在初始化。

+0

你問我的用戶開始輸入之前,加載的所有數據。如果這樣我不能這樣做,因爲我可以在textchange事件中篩選大量數據。 – Nav 2012-02-28 19:38:51

+0

直到它有匹配的東西,文本框不能自動完成。由於在用戶鍵入內容之前不會填充源代碼,因此它不會在第一個字符上自動填充。您可以嘗試對上游事件(ieKeyDown事件) – 2012-02-28 21:03:41

+0

進行過濾,但當我最初使用空字符串而不是字符串數組填充源時,它確實起作用,然後在文本更改中用字符串數組替換/附加它。但是,有時它會導致訪問衝突異常。你知道任何工作嗎? – Nav 2012-02-29 06:40:40

1

AutoComplete建議第二個字符被按下後是正常的,因爲首先,你已經初始化arr(這是你的自定義數據源)到一個空的數組。您已將arr填入TextChanged事件中,這就是爲什麼AutoComplete工作在第二個字符的原因,因爲您的數據源是根據您的第一個字符(這絕對是您不想要的)進行過濾。

這裏有一個建議:

  • FormLoad事件您的應用程序,填寫arr與所有可能的建議(我想建議的來源是從數據庫權?)。這將允許文本框建議你的第一個字符。

  • 當您輸入第一個字符時,在TextChanged事件上,根據輸入的前導字符重新加載arr數據源。

希望它有幫助。

+0

我不希望把所有的事情都放在表單加載事件中......它會造成太多的網絡擁塞,並且當要檢索的數據很大時需要大量帶寬,所以我只使用文本更改的事件......此外,因爲我說,它確實工作單字符輸入時,我初始化它在表單加載事件與空字符串首先,然後將數據源更改爲文本更改事件中的字符串數組... ...但它不穩定,因爲它有時會提供異常上文提到的。數據源實際上是一個數據庫。 – Nav 2012-03-11 02:43:46

+0

任何人都可以給我一些工作代碼? – Nav 2012-03-11 02:47:10

2

在事件處理程序設置AutoCompleteSource時,我可以複製的訪問衝突,這似乎是自動完成的程序可以訪問該AutoCompleteSource同時被替換,並銷燬。

爲了防止這種情況,你可以把一個鎖在你的代碼。

lock(this) 
{ 
arr = LoadName(empid_txt.Text.Trim()); //arr is string array       
namesCollection.AddRange(arr); 
this.empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest; 
this.empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource; 
this.empid_txt.AutoCompleteCustomSource = namesCollection; 
} 

這樣就停止了訪問衝突。

0

在表單加載調用文本框自動填充方法。

public void autocompleteData() 
    { 
      //SuggestStrings will have the logic to return array of strings either from cache/db 
      var CurrentuserId = CloudKaseWSClient.GetUserDetail(tokenUsr, tokenPasswd, Username); 
      List<string> l = new List<string>(); 
      var SearchResults = ("Select Database Query").ToList(); 
      foreach (var i in SearchResults) 
      { 
       l.Add(i.name); 
      } 
      string[] arr = l.ToArray(); 
      AutoCompleteStringCollection collection = new AutoCompleteStringCollection(); 
      collection.AddRange(arr); 

     txtSearchUser.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
     txtSearchUser.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     txtSearchUser.AutoCompleteCustomSource = collection; 
    } 

,或者您要設置自動完成文本框的靜態數據不是必須設置在了AutocompleteMode的文本框屬性設置SuggestAppend,AutocompleteSource設置CustomSource並添加靜態值inAutocompleteCustomSource設計視圖。

我希望這個解決方案可以幫助你.. 編碼快樂。:)