以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]关于二个以上checkedComboBox进行组合筛选的问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=64338)

--  作者:huangfanzi
--  发布时间:2015/2/11 13:23:00
--  [求助]关于二个以上checkedComboBox进行组合筛选的问题
有个“筛选”按钮,有如下代码:
Dim FilterPH As String
With e.Form.Controls("checkedComboBox_牌号")
    If .Value IsNot Nothing Then
        FilterPH = "牌号 In (\'" & .Value.Replace(",", "\',\'") & "\')"
    End If
End With

Dim FilterHD As String
With e.Form.Controls("checkedComboBox_厚度")
    If .Value IsNot Nothing Then
        FilterHD = "厚度 In (\'" & .Value.Replace(",", "\',\'") & "\')"
    End If
End With

If FilterPH > "" OrElse FilterHD > ""   Then
    Tables("销售出库明细主窗口_Table_工序合并表_副本").Filter = FilterPH And FilterHD & "and [工序] =\'成品入库\' and [库存标记]=true "
End If

执行后,返回:从字符串“牌号 In (\'316L\',\'4J29\',\'4J36\')”到类型“Long”的转换无效。
说明:\'316L\',\'4J29\',\'4J36\'是我任意选择的牌号

谢谢老师

--  作者:huangfanzi
--  发布时间:2015/2/11 13:43:00
--  
上面的问题初步解决了,代码如下:
Dim PH As WinForm.CheckedComboBox = e.Form.Controls("checkedComboBox_牌号")
Dim HD As WinForm.CheckedComboBox = e.Form.Controls("checkedComboBox_厚度")
Tables("销售出库明细主窗口_Table_工序合并表_副本").Filter="牌号 in (\'" & PH.Text.replace(",", "\',\'") & "\') and 厚度 in (\'" & HD.Text.replace(",", "\',\'") & "\')" & "and [工序] =\'成品入库\' and [库存标记]=true "

这段代码有个问题,就是如果有一个CheckedComboBox不选择任何值,代码执行结果会出错,如何改能实现如果不选择就是默认选择了所有项目

--  作者:有点甜
--  发布时间:2015/2/11 14:24:00
--  

 看了一下,即便没有值,也是没有问题。

 

 报什么错?


--  作者:huangfanzi
--  发布时间:2015/2/11 14:47:00
--  
甜老师,你可来了,刚才把我急死了,等不急你回复,我自己摸索,还真搞出来了,但不知代码是不是合理。

checkedComboBox_牌号 的ENTER事件
e.Sender.Combolist = "全选" & "|" & DataTables("工序合并表").GetComboListString("牌号" , "[工序] =\'成品入库\' and [库存标记]=true ")

checkedComboBox_牌号 的LEAVE事件
If e.Sender.Text.Contains("全选") Then
    e.Sender.Text = e.Sender.Combolist.Replace("全选","").Replace("|",",").TrimStart(",")
End If

checkedComboBox_厚度 的ENTER事件
e.Sender.Combolist = "全选" & "|" & DataTables("工序合并表").GetComboListString("厚度" , "[工序] =\'成品入库\' and [库存标记]=true ")

checkedComboBox_厚度 的LEAVE事件
If e.Sender.Text.Contains("全选") Then
    e.Sender.Text = e.Sender.Combolist.Replace("全选","").Replace("|",",").TrimStart(",")
End If

筛选按钮的CLICK事件
Dim PH As WinForm.CheckedComboBox = e.Form.Controls("checkedComboBox_牌号")
Dim HD As WinForm.CheckedComboBox = e.Form.Controls("checkedComboBox_厚度")

If PH.Text="" Then
PH.Text = PH.Combolist.Replace("全选","").Replace("|",",").TrimStart(",")
End If

If HD.Text="" Then
HD.Text = HD.Combolist.Replace("全选","").Replace("|",",").TrimStart(",")
End If

Tables("销售出库明细主窗口_Table_工序合并表_副本").Filter="牌号 in (\'" & PH.Text.replace(",", "\',\'") & "\') and 厚度 in (\'" & HD.Text.replace(",", "\',\'") & "\')" & "and [工序] =\'成品入库\' and [库存标记]=true "

以上代码可以实现如下功能:
CheckedComboBox的下拉中会有“全选”的项目,选中后就可实现全选的效果
CheckedComboBox的下拉中不选中任何项目,点筛选按钮后实现CheckedComboBox默认全选的效果

以上代码写的是否合理,是否有更直接简便的代码,请甜老师赐教!
[此贴子已经被作者于2015/2/11 14:47:07编辑过]

--  作者:有点甜
--  发布时间:2015/2/11 14:54:00
--  
  代码合理,也只能这样做,那现在有什么问题?
--  作者:huangfanzi
--  发布时间:2015/2/11 15:01:00
--  
还有一个问题,想实现联动筛选功能,感觉有点难,老师看看能不能帮我写出来
假定有个 CheckBox_联动筛选 控件,当这个被选中时,实现以下功能:
checkedComboBox_牌号中选中了牌号A,B,C,这时checkedComboBox_厚度的下拉内容中只有牌号A、B、C所对应的厚度,不会显示所有厚度,这样可大大提高选择速度,甜老师,这段感觉好复杂的代码能帮我写下吗?

--  作者:Bin
--  发布时间:2015/2/11 15:04:00
--  
参考 http://www.foxtable.com/help/topics/1523.htm
--  作者:有点甜
--  发布时间:2015/2/11 15:18:00
--  
 参考7楼,条件你变换成 in (xxx) 即可。