C# 按文本框过滤Gridview已更改

C# 按文本框过滤Gridview已更改,c#,asp.net,wcf,gridview,C#,Asp.net,Wcf,Gridview,我在互联网上搜索了很长很长时间,想找到我的问题的答案,但没有找到答案。 我在C WCF中有一个现有的gridview,它通过sql数据源获取数据。 我想在文本框中输入任何内容后对其进行过滤。 问题是,当我试图遵循我发现的一些方法时,我总是得到一个空值,或者什么都没有改变 我尝试了以下方法: 这不会给我一个错误,只是简单地刷新视图,就好像从未应用过滤器一样 这是我找到并尝试过的另一个解决方案: private void tbSearchContracts_TextChanged(object se

我在互联网上搜索了很长很长时间,想找到我的问题的答案,但没有找到答案。 我在C WCF中有一个现有的gridview,它通过sql数据源获取数据。 我想在文本框中输入任何内容后对其进行过滤。 问题是,当我试图遵循我发现的一些方法时,我总是得到一个空值,或者什么都没有改变

我尝试了以下方法:

这不会给我一个错误,只是简单地刷新视图,就好像从未应用过滤器一样

这是我找到并尝试过的另一个解决方案:

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正在返回一个对象列表。

以下是一个在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或您遵循的任何命名约定,然后编写一个函数,该函数将查询您的数据库并检索您的论文名列表,如下所示:

    [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;
    }

我最终做的不是最干净的方式,但我发现这是最容易完成事情的方式

  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();
}

遗憾的是,我不是在网页上使用它,而是在wcf应用程序中使用它。@MathiasRønnowNørtoft wcf用于服务实现,可由多个客户端使用,例如windows窗体应用程序、网站等。您有一个事件私有无效tbSearchContracts_TextChangedobject sender,EventArgs e,我假设它是WPF或WinForms应用程序上的按钮单击或某种形式的控件,充当消费服务调用的客户端。如果您向解决方案中添加一个测试WinForms应用程序,并包含一个Web浏览器控件以在脚本标记中调用JQuery函数,您仍然可以实现上述目标。请看一下:这确实有点有趣,我将看一看@MathiasRønnowNørtoft如果此实现有助于您,请随意投票。快乐编码。你的dgvPapers。更新;行将不断地访问数据库,从而极大地影响您的性能。
   <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>
  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();
}