2017-05-23 33 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 –