2017-05-23 37 views
0

我已經搜索了長期和廣泛的interwebs爲我的問題的答案,但沒有任何工作。
我在C#WCF中有一個現有的gridview,它通過sql數據源獲取它的數據。
我想在輸入文本框之後進行過濾。
事情是,當我試圖按照我發現的一些方法,我總是得到一個空值或什麼都沒有改變。
通過文本框過濾Gridview已更改


我已經試過如下:

private void tbSearchContracts_TextChanged(object sender, EventArgs e) 
{ 
    BindingSource src = new BindingSource(); 
    src.DataSource = dgvPapers.DataSource; 
    src.Filter = string.Format("PaperName like '%{0}%'", tbSearchContracts.Text.Trim()); 
    dgvPapers.DataSource = src; 
    dgvPapers.Refresh(); 
} 

這不會給我一個錯誤,但只是簡單地刷新視圖,就好像從來沒有應用濾鏡。

這是另一種解決辦法,我發現和嘗試:

private void tbSearchContracts_TextChanged(object sender, EventArgs e) 
{ 
    (dgvPapers.DataSource as DataTable).DefaultView.RowFilter = string.Format("PaperName like '%{0}%'", tbSearchContracts.Text.Trim()); 
} 

如果本試圖將數據源轉換爲數據表時返回null。

* dgvPapers.DataSource返回對象列表。

回答

0

我最終做的不是最乾淨的方式,但我發現它是最簡單的方法來完成任務。

List<Object> products = ((IEnumerable)dgvPapers.DataSource).Cast<object>().ToList(); 
    List<ContractPaperStepDTO> altered = new List<ContractPaperStepDTO>(); 
    foreach (var item in products) 
    { 
    altered.Add((ContractPaperStepDTO)item); 
    } 
    altered = altered.Where(c => c.PaperName.ToLower().Contains(tbSearchContracts.Text.ToLower())).ToList(); 
    dgvPapers.DataSource = altered; 
    dgvPapers.Update(); 
} 
+0

您的'dgvPapers.Update();'行會不斷地訪問數據庫,從而嚴重影響您的性能。 –

1

下面是使用jQuery的幫助,爲我工作的解決方案:

步驟1:SQL編寫存儲過程(接受一個輸入參數)來檢索數據庫紙張名稱(假設你使用SQL Server作爲DBMS):

create proc [dbo].[spGetMatchingPaperIds] 
@PaperId nvarchar(Whatever size) 
as 
begin 
select PaperId from TableStoringYourPaperIds where PaperId like @PaperId + '%' 
end 
GO 

步驟2:Web服務 創建Web服務(並將其命名爲PaperSearchService.asmx或任何命名約定你遵循)和寫,將查詢您的DA功能tabase和檢索文件名的列表,像這樣:

[WebMethod] 
    public List<string> getPaperNames(string DeviceIdString) 
    { 
     List<string> paperNames = new List<string>(); 
     string cs = ConfigurationManager.ConnectionStrings["YourConnectionStringToTheDatabase"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(cs)) 
     { 
      SqlCommand cmd = new SqlCommand("spGetMatchingPaperIds", con); 
      cmd.CommandType = CommandType.StoredProcedure; 

      SqlParameter parameter = new SqlParameter("@PaperId", PaperId); 
      cmd.Parameters.Add(parameter); 
      con.Open(); 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       paperNames.Add(rdr["PaperId"].ToString()); 
      } 
     } 

     return paperNames; 
    } 

第3步:HTML標記 我假設你使用的是母版頁所以這應該去裏面你的內容佔位符之一。

使用開發者工具來檢查的jQuery的錯誤,則可能會在瀏覽器上按一下F12同時調試,並從CDN下載相關jQuery庫,只是它包含在你的主網頁,但我最後一次檢查其jquery-1.7.min.js - 只需再檢查一次。這個前面提到的庫具有自動完成功能,否則它將無法工作。

<script type="text/javascript"> 
    $(function() { 
       $('#<%= tbSearchContracts.ClientID %>').autocomplete({ 
        source: function (request, response) { 
         $.ajax({ 
          url: "PaperSearchService.asmx/getPaperNames", 
          data: "{ 'PaperId': '" + request.term + "' }", 
          type: "POST", 
          dataType: "json", 
          contentType: "application/json;charset=utf-8", 
          success: function (data) { 
           response(data.d); 
          }, 
          error: function (result) { 
           alert('There is a problem processing your request'); 
          } 
         }); 
        }, 
        minLength: 0 
       }); 
      }); 

      //Below are some nice-to-have's: 
      function CreateWaterMark(defaultText, textBoxControl) { 
      if (textBoxControl.value.length == 0) { 
       textBoxControl.style.color = "gray"; 
       textBoxControl.value = defaultText; 
      } 
     } 

     function ClearWaterMark(defaultText, textBoxControl) { 
      if (textBoxControl.value == defaultText) { 
       textBoxControl.style.color = "black"; 
       textBoxControl.value = ""; 
      } 
     } 
     </script> 

<asp:TextBox ID="tbSearchContracts" CssClass="whatever styling you have used" onblur="CreateWaterMark('Search Paper Names Here', this);" onfocus="ClearWaterMark('Search Paper Names Here', this);" onkeyup="hasPendingChanges()" Text="Search Paper Names Here" runat="server"></asp:TextBox> 
+0

很遺憾,iam不是在網頁上,而是在wcf應用程序中使用它。 –

+1

@MathiasRønnowNørtoftWCF旨在用於多個客戶端可以使用的服務實現,例如Windows窗體應用程序,網站等。您有一個事件'private void tbSearchContracts_TextChanged(object sender,EventArgs e)',我假設它是一個按鈕單擊或WPF或WinForms應用程序的某種形式的控制,充當客戶端使用您的服務調用。如果您將測試WinForms應用程序添加到您的解決方案幷包含Web瀏覽器控件以在腳本標記中調用JQuery函數,仍然可以實現上述目標。 –

+1

看看這個:https://stackoverflow.com/questions/42095271/how-to-embed-jquery-in-a-winforms-app-to-use-in-a-webbrowser-control –