通过文本框过滤Gridview已更改

时间:2017-05-23 13:40:03

标签: c# asp.net wcf gridview

为了回答我的问题,我已经长时间搜索了这个互联网,但没有任何效果。
我在C#WCF中有一个现有的gridview,它通过sql数据源获取数据。
我希望在输入文本框之后对其进行过滤。
问题是当我试图遵循我发现的一些方法时,我总是得到一个空值或者没有任何改变。

我尝试过以下方法:

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

2 个答案:

答案 0 :(得分: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服务(并将其命名为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;
    }

第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>

答案 1 :(得分:0)

我最终做的不是最干净的方式,但我发现这是完成任务的最简单方法。

  <Style TargetType="Button" x:Key="FlatButtonStyle">
        <Setter Property="Background" Value="#253135"/>
        <Setter Property="Foreground" Value="#253135"/>
            <Setter Property="Width" Value="150"/>
            <Setter Property="Height" Value="150"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border BorderThickness="0"
                    Background="{TemplateBinding Background}"
                    CornerRadius="12"
                                Name="Border">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="Border" Property="Background" Value="White" />
                            <Setter TargetName="Border" Property="BorderBrush" Value="Black" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>