2012-07-28 80 views
0

你好大師我有一個窗體中的DataGridView對象。在一個服務類中,我有一個方法爲Winforms更新DataGridView在另一個線程

Form.CheckForIllegalCrossThreadCalls = false; 
Thread tr1 = 
    new Thread(() => 
    { 
     List<Musteri> list = null; 
     IEnumerable<Musteri> result = from Musteri m in Db4OService.Database 
             where (
               m.servisAdi.Contains(text) || 
               m.il.Contains(text)) 
             select m; 
     list = result.ToList<Musteri>(); 


     DataGridView dataGridView = ((DataGridView)sayfa.Controls.Find("dataGridView1", false)[0]); 
     DataTable dt = ListToDataTable(list); 
     try 
     { 
      dataGridView.DataSource = dt; 
      dataGridView.Refresh(); 
     } 
     catch (Exception e) 
     { 
       Console.Write(e); 

     } 

    }); 
tr1.Start(); 

此方法每次都從textBox的textChanged方法中調用。所以我想在打字時使它平滑。當我在一個線程中完成所有內容時,我必須等待搜索方法完成後才能輸入另一個字母。我的方法不工作:(任何幫助歡迎。謝謝!!

回答

0

你將不得不分開工作,並通過另一個線程使用BackgroundWorker Class做到這一點,這將幫助文本框保持解凍,而工作正在在後臺完成

0

這裏沒有試圖拿起你的英文,但是你的文章中的代碼是在TextChangedEvent上調用,還是代碼生成了TextChangeEvent,並不是很清楚。我會希望代碼有問題

  1. 我會假設提供的鱈魚e是在TextChangedEvent上調用的,TextChangedEvent查找數據庫中的數據並填充Grid。
  2. 我看到你正試圖從非GUI線程更新你的網格。首先,從非GUI線程更新GUI是一個壞主意。
  3. 根據我所瞭解的你想要做的事情,最好讓這個線程成爲一個可跟蹤的變量,所以當用戶鍵入一些文本,並且如果你的搜索還沒有返回,你可能想要停止數據庫查找,因爲用戶可能輸入了更多內容。底線是,用戶輸入可能會改變您的搜索條件和顯示結果,所以您應該能夠取消您的搜索和網格更新,否則您只是在浪費資源搜索用戶不再感興趣的內容。

下面是我會怎樣代碼:

bool searching = false; 
object searchThreadLock = new object(); 
Thread searchThread = null; 

void TextChangedEvent() { 
    lock (searchThreadLock) { 
     if (searching && searchThread != null && searchThread.IsAlive) 
      searchThread.Abort(); 

     lookupForData(); 
    } 
} 

void lookupForData() { 
    searchThread = new Thread(() => { 
     // Your code to retrieve relevant data from DB based on your TextChangedEvent goes here 
     searching = true; 
     try { 
      List<Musteri> list = null; 
      IEnumerable<Musteri> result = 
       from Musteri m in Db4OService.Database 
        where (
         m.servisAdi.Contains(text) || 
         m.il.Contains(text)) 
        select m; 
      list = result.ToList<Musteri>(); 
      DataTable dt = ListToDataTable(list); 
      updateGrid(dt); 
     } catch (ThreadAbortException ex) { 
     } finally { 
      searching = false; 
     } 
    }); 
    searchThread.start(); 
} 

void updateGrid(DataTable dt) { 
    DataGridView dataGridView = ((DataGridView)sayfa.Controls.Find("dataGridView1", false)[0]); 
    if (dataGridView.InvokeRequired) { 
     dataGridView.BeginInvoke(new Action<DataTable>(updatdeGrid), dt); 
     return; 
    } 

    // Your code to update the grid goes here 
    dataGridView.DataSource = dt; 
    dataGridView.Refresh(); 
} 

PS:需要注意的是Thread.Abort的通常是一個壞主意,它應該由你的應用程序特定的邏輯來代替停止DB搜索。由於我不確定如何正確停止您的LINQ查詢,所以我已將其放在適當的位置。

0
Form.CheckForIllegalCrossThreadCalls = false; 

這很糟糕,學會不要使用它。永遠永遠永遠永遠永遠。閱讀關於調用。

相關問題