使用' LIKE'制作动态网格视图矩阵

时间:2016-07-11 14:59:28

标签: asp.net gridview

早些时候我遇到了一个问题,并给出了一些优秀的指导,来自Nikki9696为我的网格视图调整动态数据源值,我将在下面展示,因为我现在已经实现并正在使用它。这非常有效。我在网格视图的正上方放置了一系列带有标签的文本框,用户可以将它们留空(不会过滤记录)或提供与任何一个相应列中的项匹配的值。文本框将该列限制为仅作为过滤器的一部分的值,同时允许用户复合多个框以缩小过滤器。工作得很好!

我真的想更进一步,并且已经与它搏斗了大约一周,尽管在网上搜索了一些人正在进行类似过滤的例子,但却没有去过。我希望这些中的每一个都能运行而不是=或null到LIKE或null,这样我的用户就可以在文本框中提供部分信息来提取结果而不是完全匹配。我无法弄清楚如何改变我的WHERE子句来做到这一点。

<asp:SqlDataSource ID="InventoryList" runat="server" ConnectionString='<%$ ConnectionStrings:CMDB_testConnectionString %>' SelectCommand="SELECT [AssetID], [AssetType], [AssetName], [AssetShortDesc], [AssetLongDesc], [AssetAddNotes], [AssetManuf], [AssetModel], [AssetTag], [AssetSerialNum], [AssetAcqDate], [AssetDTAssetID], [AssetLocGrp], [AssetLoc1], [AssetLoc2], [AssetLoc3], [AssetParent], [AssetStatus], [AssetPropType], [AssetPrimUser], [AssetEntered], [AssetEnteredBy], [AssetOwner], [AssetCompany], [AssetPriIPAddr], [AssetPriMACAddr], [AssetPriOS], [AssetPriOSSP], [AssetNotes], [AssetAdminGrp], [AssetOrgID], [AssetOperType], [AssetOperStatus] FROM [cmdbv_Assets_CInTrac] where AssetID=isnull(@AssetID,AssetID) and AssetName=isnull(@AssetName,AssetName) and AssetType=isnull(@AssetType,AssetType) and AssetManuf=isnull(@AssetManuf,AssetManuf) and AssetModel=isnull(@AssetModel,AssetModel) and AssetTag=isnull(@AssetTag,AssetTag) and AssetSerialNum=isnull(@AssetSerialNum,AssetSerialNum) and AssetDTAssetID=isnull(@AssetDTAssetID,AssetDTAssetID) and AssetLocGrp=isnull(@AssetLocGrp,AssetLocGrp) and AssetLongDesc=isnull(@AssetLongDesc,AssetLongDesc) and AssetOrgID=isnull(@AssetOrgID,AssetOrgID) and AssetPriIPAddr=isnull(@AssetPriIPAddr,AssetPriIPAddr) and AssetStatus=isnull(@AssetStatus,AssetStatus)" CancelSelectOnNullParameter="false">

<SelectParameters>
       <asp:Controlparameter Name="AssetID" ControlID="AssetIDTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetName" ControlID="AssetNameTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetType" ControlID="AssetTypeTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetShortDesc" ControlID="AssetShortDescTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetManuf" ControlID="AssetManufTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetModel" ControlID="AssetModelTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetTag" ControlID="AssetTagTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetSerialNum" ControlID="AssetSerialNumTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetDTAssetID" ControlID="AssetDTAssetIDTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetLocGrp" ControlID="AssetLocGrpTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetLongDesc" ControlID="AssetLongDescTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetOrgID" ControlID="AssetOrgIDTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetPriIPAddr" ControlID="AssetPriIPAddrTbx" Type="String" ConvertEmptyStringToNull="true" />
       <asp:ControlParameter Name="AssetStatus" ControlID="AssetStatusTbx" Type="String" ConvertEmptyStringToNull="true" />
 </SelectParameters>

我尝试过AssetName =&#39;%@ AssetName%&#39;的变体。和AssetName =&#39;%&#39; + @ AssetName +&#39;%&#39;以及切断其他装置,但没有任何东西甚至做了什么,而不是完全阻止所有行返回。

我会非常感谢任何想法,因为我真的希望在我的过滤器上看到这一点。

此致 肯...

好吧,我们似乎在这方面取得了一些进展,但并未完全。以下是我修改了AssetName以反映在数据源中的内容,我可能在语法上搞砸了一些内容,但我认为我完全按照你的说法进行了操作。

([AssetName] LIKE '%' + CASE WHEN @AssetName is null Then '' Else @AssetName End + '%') 

根据您的建议对DataSource进行最新更改:

    <asp:SqlDataSource ID="InventoryList" runat="server" 
    ConnectionString='<%$ ConnectionStrings:CMDB_testConnectionString %>' 
    SelectCommand="SELECT [AssetID], [AssetType], [AssetName], [AssetShortDesc], [AssetLongDesc], [AssetAddNotes], [AssetManuf], [AssetModel], [AssetTag], [AssetSerialNum], [AssetAcqDate], [AssetDTAssetID], [AssetLocGrp], [AssetLoc1], [AssetLoc2], [AssetLoc3], [AssetParent], [AssetStatus], [AssetPropType], [AssetPrimUser], [AssetEntered], [AssetEnteredBy], [AssetOwner], [AssetCompany], [AssetPriIPAddr], [AssetPriMACAddr], [AssetPriOS], [AssetPriOSSP], [AssetNotes], [AssetAdminGrp], [AssetOrgID], [AssetOperType], [AssetOperStatus] FROM [cmdbv_Assets_CInTrac]"
    FilterExpression=" Convert(AssetID, 'System.String') LIKE '{0}%' 
    and AssetName LIKE '{1}%' 
    and AssetType LIKE '{2}%' 
    and AssetShortDesc LIKE '{3}%' 
    and AssetManuf LIKE '{4}%' 
    and AssetModel LIKE '{5}%' 
    and AssetTag LIKE '{6}%' 
    and AssetSerialNum LIKE '{7}%' 
    and AssetDTAssetID LIKE '{8}%' 
    and AssetLocGrp LIKE '{9}%' 
    and AssetLongDesc LIKE '{10}%' 
    and AssetOrgID LIKE '{11}%' 
    and AssetPriIPAddr LIKE '{12}%' 
    and Convert(AssetStatus, 'System.string') LIKE '{13}%'">
<FilterParameters>
       <asp:ControlParameter Name="AssetID" ControlID="AssetIDTbx" PropertyName="Text" />
       <asp:ControlParameter Name="AssetName" ControlID="AssetNameTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetType" ControlID="AssetTypeTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetShortDesc" ControlID="AssetShortDescTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetManuf" ControlID="AssetManufTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetModel" ControlID="AssetModelTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetTag" ControlID="AssetTagTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetSerialNum" ControlID="AssetSerialNumTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetDTAssetID" ControlID="AssetDTAssetIDTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetLocGrp" ControlID="AssetLocGrpTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetLongDesc" ControlID="AssetLongDescTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetOrgID" ControlID="AssetOrgIDTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetPriIPAddr" ControlID="AssetPriIPAddrTbx"  PropertyName="Text" />
       <asp:ControlParameter Name="AssetStatus" ControlID="AssetStatusTbx"  PropertyName="Text" />
 </FilterParameters> 
 </asp:SqlDataSource>

2 个答案:

答案 0 :(得分:0)

然后你需要将值作为string.empty传递,并且你需要为每个QueryStringParameter允许covertingEmptyStringToNull。

所以步骤简单如下:

1-为您的查询中的每个ConvertEmptyStringToNull="true"添加QueryStringParameter。以下示例显示了QueryStringParameter元素的外观:

<asp:QueryStringParameter QueryStringField="@AssetName" 
                          DefaultValue="" 
                          Name="AssetName" 
                          Type="String" 
                          ConvertEmptyStringToNull="true">
</asp:QueryStringParameter>

2-现在,为了允许在SqlDataSource的queryString中传递string.Empty,您可以在Where子句中使用CASE WHEN。以下是演示此示例的示例。然后在您的方案中,您可以将其应用于每个参数。

SELECT [AssetName]
FROM [cmdbv_Assets_CInTrac] 
WHERE ([AssetName] LIKE '%' + 
CASE WHEN @AssetName is NULL 
Then '' 
Else @AssetName 
End + '%')  

答案 1 :(得分:0)

要直接使用文本框映射LIKE,您还可以使用[FilterExpression] [1]。例如,假设您有以下Textbox进行过滤

<asp:TextBox ID="searchTextBox" runat="server"></asp:TextBox>

您可以对SqlDataSource进行编码,如以下示例所示:

<asp:SqlDataSource ID="gridDataSource" runat="server" 
       ConnectionString='<%$ ConnectionStrings:CMDB_testConnectionString %>'
       SelectCommand="SELECT [AssetName] FROM [cmdbv_Assets_CInTrac]"
       FilterExpression="AssetName LIKE '{0}%'">
       <FilterParameters>
  <asp:ControlParameter Name="AssetName" ControlID="searchTextBox" PropertyName="Text" />
       </FilterParameters>
</asp:SqlDataSource>

在您的方案中,您必须为要映射到ControlParameter的每列创建TextBox。确保按照文本框控件ID进行映射,如上例所示。

更新2 您的陈述应如下所示。在您的回答中,您重复FilterExpression并且没有为每列增加{0}。所以,SqlDataSource应该如何

<asp:SqlDataSource ID="InventoryList" runat="server" 
ConnectionString='<%$ ConnectionStrings:CMDB_testConnectionString %>'
SelectCommand="SELECT [AssetID], [AssetType], [AssetName], [AssetShortDesc],
 [AssetLongDesc], [AssetAddNotes], [AssetManuf], [AssetModel], [AssetTag]
[AssetSerialNum], [AssetAcqDate], [AssetDTAssetID], [AssetLocGrp], [AssetLoc1], 
[AssetLoc2], [AssetLoc3], [AssetParent], [AssetStatus], [AssetPropType], 
[AssetPrimUser], [AssetEntered], [AssetEnteredBy], [AssetOwner], [AssetCompany], 
[AssetPriIPAddr], [AssetPriMACAddr], [AssetPriOS], [AssetPriOSSP], [AssetNotes], 
[AssetAdminGrp], [AssetOrgID], [AssetOperType], [AssetOperStatus] 
FROM  [cmdbv_Assets_CInTrac]" 

FilterExpression=" Convert(AssetID , 'System.String') LIKE '{0}%' 
AND AssetName LIKE '{1}%' 
And AssetType LIKE '{2}%'
AND AssetShortDesc LIKE '{3}%' 
AND AssetManuf LIKE '{4}%' 
AND AssetModel LIKE '{5}%'
AND AssetTag LIKE '{6}%' 
AND Convert(AssetSerialNum , 'System.String') LIKE '{7}%' 
AND Convert(AssetDTAssetID , 'System.String') LIKE '{8}%' 
AND AssetLocGrp LIKE '{9}%'
AND AssetLongDesc LIKE '{10}%'
AND Convert( AssetOrgID, 'System.String') LIKE '{11}%' 
AND AssetPriIPAddr LIKE '{12}%'
AND AssetStatus LIKE '{13}%'">
<FilterParameters>
<asp:Controlparameter Name="AssetID" ControlID="AssetIDTbx" PropertyName="Text" />
<asp:ControlParameter Name="AssetName" ControlID="AssetNameTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetType" ControlID="AssetTypeTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetShortDesc" ControlID="AssetShortDescTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetManuf" ControlID="AssetManufTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetModel" ControlID="AssetModelTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetTag" ControlID="AssetTagTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetSerialNum" ControlID="AssetSerialNumTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetDTAssetID" ControlID="AssetDTAssetIDTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetLocGrp" ControlID="AssetLocGrpTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetLongDesc" ControlID="AssetLongDescTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetOrgID" ControlID="AssetOrgIDTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetPriIPAddr" ControlID="AssetPriIPAddrTbx"  PropertyName="Text" />
<asp:ControlParameter Name="AssetStatus" ControlID="AssetStatusTbx"  PropertyName="Text" />
 </FilterParameters>
</asp:SqlDataSource>