循环遍历包含多个的列表并选择所选的列表

时间:2014-10-12 22:48:10

标签: coldfusion

我正在处理我获得两个列表的代码。我正在尝试使用这些列表在具有“multiple”属性的选择框中预选项目。但是,我无法保留选择。

代码:

<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop> 
</select>

示例值:

  • lstFinds = abc,xyz
  • getproducts.ptype还包含abc,xyz
  • 等值

如果用户同时存在两个值,我想保持两个选定状态。如果存在,请选择一个。如果没有选择,则不保留。

我也尝试使用listContains,但它没有用。

从pastebin linkL转移

ptype值在数据库中以逗号分隔,即“abc,wed,mon,def”。无论这些值是什么,我需要匹配并选择listFind中具有相同值的那些值。我希望我说得更清楚。

<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfquery name="getproducts" datasource="cdfg">
        select ptype
         from
        mytable  
        where
        ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#id#">
</cfquery>


<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop>
</select>

2 个答案:

答案 0 :(得分:3)

这有三个问题:

<cfloop list="#lstFinds#" index="k" delimiters=",">
<option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
</cfloop>

首先,正如其他人所提到的,在listfindnocase函数中,列表首先出现。

接下来,在排除第一个问题后,您没有得到所需结果的原因是getproducts.ptype不是列表。它是查询第一行的值。要获取列表中的所有值,请使用valuelist()函数。

最后,选择选项的正确语法是selected="selected"。所以上面的代码块应该是这样的:

<cfloop list="#lstFinds#" index="k" delimiters=",">
<option value="#k#" 
<cfif listfindnocase(ValueList(getproducts.ptype), k)>
selected="selected"
</cfif>>#k#
</option>
</cfloop>

答案 1 :(得分:0)

好的,提问者通过Pastebin

提供了以下代码
<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfquery name="getproducts" datasource="cdfg">
    select ptype
     from
    mytable  
    where
    ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#id#">
</cfquery>

these are coming from database column ptype of a table as: abc,wed,mon,def

<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop>
</select>

我在cflive.net上运行了以下代码

<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfset getProducts = {pType = "abc,wed,mon,def"}>

<cfoutput><select name="sbbox" id="sbbox" class="can"  multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(getproducts.ptype,k)#>selected</cfif>>#k#</option>
  </cfloop>
  </select></cfoutput>

当我运行此代码时,选择了abc,def,mon和wed。是否应该选择这些,还是应该检查其他人?

此代码似乎正在按照您的要求进行操作。我做的唯一改变

  • 根据Matt在问题评论中提出的建议改变了逻辑。
  • 因为我没有运行查询的数据,所以我设置了一个带有键“pType”的getProducts结构,并且Asker建议它们可能是值。出于此目的,我的示例结构在功能上与单行查询相同。

最后,您是否可能尝试从多行中提取此信息?你可以试试

<cfset variables.ptypes = valuelist(getproducts.ptype)>
<cfoutput><select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(variables.ptypes,k)#>selected</cfif>>#k#</option>
  </cfloop>
  </select></cfoutput>