为了回答我的问题,我已经长时间搜索了这个互联网,但没有任何效果。
我在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返回一个对象列表。
答案 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>