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