我的思路是:有3个ComboBox,让用户做分级选择,一个“刷新查询”命令按扭,实现筛选查询功能。
求教的地方:第1次执行代码查询是正常的,然后用户在ComboBox中选了其它条件执行查询后,再选条件执行查询,MSHFlexGrid表格中就会少了一条记录。做实验,Set DataGrid1.DataSource = Adodc2 ,DataGrid表格中始终是正常的。我琢磨好几天了,已经极至郁闷,请高手们帮帮小弟吧!衷心感谢!
主要代码如下:Private Sub sxcx()  '刷新查询。
   Text7.Visible = False
   MSHFlexGrid1.Rows = 3  '让其总行数等于3,目的是为了让表格恢复到干净状态。
   Dim i As Byte  '此循环语句是为了清空表格第1行里的数据。
   For i = 1 To MSHFlexGrid1.Cols - 1
       MSHFlexGrid1.TextMatrix(2, i) = ""
   Next
   MSHFlexGrid1.Row = 2  '将活动单元格移到第2行。
   
   If Text3.Text <> "" Then  '文本框中的内容是由ComboBox中赋过来的。
     Adodc2.ConnectionString = Cnn
     Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 6 And left(s.类别编号,6)= '" + Trim(Text3.Text) + "' order by s.类别编号 asc,s.名称 asc"
     Adodc2.Refresh  'Refresh 方法(ADO):更新集合中的对象以便反映来自并特定于提供者的对象。
     If Adodc2.Recordset.RecordCount > 0 Then  'RecordCount 属性(ADO):指示 Recordset 对象中记录的当前数目。返回长整型值。
       Adodc2.Recordset.MoveFirst  '使用 MoveFirst 方法将当前记录位置移动到 Recordset 中的第一个记录。
       Do While Adodc2.Recordset.EOF = False
         Call drsj  '调用通用过程。往“MSHFlexGrid1”表格读入数据。
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1  '在表格中增加一行空行。
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1  '将活动单元格向前移动1行。移到刚刚空行位置。
         Adodc2.Recordset.MoveNext  '使用 MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。
       Loop
       MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)  '删除由循环语句生成的最后一行的空行。
     End If
   ElseIf Text2.Text <> "" Then
     Adodc2.ConnectionString = Cnn
     Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 4 And left(s.类别编号,4)= '" + Trim(Text2.Text) + "' order by s.类别编号 asc,s.名称 asc"
     Adodc2.Refresh
     If Adodc2.Recordset.RecordCount > 0 Then
       Adodc2.Recordset.MoveFirst
       Do While Adodc2.Recordset.EOF = False
         Call drsj
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
         Adodc2.Recordset.MoveNext
       Loop
       MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
     End If
   ElseIf Text1.Text = "全部" Then
     Adodc2.ConnectionString = Cnn
     Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " order by s.类别编号 asc,s.名称 asc"
     Adodc2.Refresh
     Set DataGrid1.DataSource = Adodc2  '做实验用,看Adodc2查询是否正常。反映在DataGrid1里是正常的。
     If Adodc2.Recordset.RecordCount > 0 Then
       Adodc2.Recordset.MoveFirst
       Do While Adodc2.Recordset.EOF = False
         Call drsj
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
         Adodc2.Recordset.MoveNext
       Loop
       MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
     End If
   Else
     Adodc2.ConnectionString = Cnn
     Adodc2.RecordSource = "Select s.名称,s.单位,s.基价,c.采购价审批与查阅表ID,s.商品资料ID,c.含税原价,c.含税折扣率,(c.含税原价*c.含税折扣率) as 含税折后价,c.含税价报价人,c.含税价报价时间,c.未税原价,c.未税折扣率,(c.未税原价*c.未税折扣率) as 未税折后价,c.未税价报价人,c.未税价报价时间 from 采购价审批与查阅表 as c,商品资料 as s where c.商品资料ID=s.商品资料ID and c.供应商与客户资料ID= " + Trim(Text6.Text) + " and Len(Trim(s.类别编号)) >= 2 And left(s.类别编号,2)= '" + Trim(Text1.Text) + "' order by s.类别编号 asc,s.名称 asc"
     Adodc2.Refresh
     If Adodc2.Recordset.RecordCount > 0 Then
       Adodc2.Recordset.MoveFirst
       Do While Adodc2.Recordset.EOF = False
         Call drsj
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
         Adodc2.Recordset.MoveNext
       Loop
       MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
     End If
   End If   Call gbbjs  '调用通用过程。改变“MSHFlexGrid1”控件指定列的背景色。
End Sub

解决方案 »

  1.   

    思路不太正确吧?
    按条件检索只是改变RecordSet中的数据,显示只是从RecordSet中加载而已.楼主再想想看
      

  2.   

    是我的思路不对吗?不对在那里呢?为什么第1遍执行是正常的呢?并且,我实验了一下,要是加载在DataGrid表格中也是正常的。所以我想……哎,头疼头疼,到底那里问题呢?快发疯了哦!
      

  3.   

    我真还算是个菜鸟,本来我还不懂得断点的应用。我看了相关的帖子,现在懂了。
    我设了断点后,按F8键逐句逐句的执行句子,现在确定下来是循环语句那里有问题。
      Do While Adodc2.Recordset.EOF = False  '我断点设在这句上。
         Call drsj
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '第一遍执行循环是正常的,到了第2遍
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1       '的时候这两句没反应,第3遍开始又都好了。
         Adodc2.Recordset.MoveNext
      Loop
    请教高手这是怎么回事呢?
      

  4.   

    没反应是什么意思
    mshflexgrid1.additem后,你看看行数是不是增加了?你检查一下drsj干了什么?
      

  5.   

    非常感谢这位兄弟再一次的给予我帮助!
    问题就出在这第2遍循环,第2遍循环的时候,在执行这句“MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1”,MSHFlexGrid1表格中并没有增加出一行来,那随后的这句“MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1 ”自然也就没体现了,奇怪的也不报错。但“Adodc2.Recordset.MoveNext”这句应该是有执行的,因为接着第3遍循环的时候,MSHFlexGrid1中增加出来的记录是第3条记录。drsj通用过程为:
    Private Sub drsj()  '往“MSHFlexGrid1”表格读入数据。
      If Adodc2.Recordset.Fields("名称") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 1) = Adodc2.Recordset.Fields("名称")
      'TextMatrix(行,列) 属性:返回或设置一个任意单元的文本内容。Col(列) 和 Row(行) 属性(MSHFlexGrid):这两个属性返回或设置 MSHFlexGrid 中活动单元的坐标。在设计时不可用。
      If Adodc2.Recordset.Fields("单位") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2) = Adodc2.Recordset.Fields("单位")
      If Adodc2.Recordset.Fields("基价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 3) = Format(Val(Adodc2.Recordset.Fields("基价")), "0.00")
      'Val 函数:返回包含于字符串内的数字,字符串中是一个适当类型的数值。  Format 函数:返回 Variant变体型 (String字符型),其中含有一个表达式,它是根据格式表达式中的指令来格式化的。
      If Adodc2.Recordset.Fields("采购价审批与查阅表ID") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 4) = Adodc2.Recordset.Fields("采购价审批与查阅表ID")
      If Adodc2.Recordset.Fields("商品资料ID") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 6) = Adodc2.Recordset.Fields("商品资料ID")
      If Adodc2.Recordset.Fields("含税原价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 7) = Format(Val(Adodc2.Recordset.Fields("含税原价")), "0.00")
      If Adodc2.Recordset.Fields("含税折扣率") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 8) = Format(Val(Adodc2.Recordset.Fields("含税折扣率")), "0.000")
      If Adodc2.Recordset.Fields("含税折后价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 9) = Format(Val(Adodc2.Recordset.Fields("含税折后价")), "0.00")
      If Adodc2.Recordset.Fields("含税价报价人") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 10) = Adodc2.Recordset.Fields("含税价报价人")
      If Adodc2.Recordset.Fields("含税价报价时间") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 11) = Adodc2.Recordset.Fields("含税价报价时间")
      If Adodc2.Recordset.Fields("未税原价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 12) = Format(Val(Adodc2.Recordset.Fields("未税原价")), "0.00")
      If Adodc2.Recordset.Fields("未税折扣率") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 13) = Format(Val(Adodc2.Recordset.Fields("未税折扣率")), "0.000")
      If Adodc2.Recordset.Fields("未税折后价") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 14) = Format(Val(Adodc2.Recordset.Fields("未税折后价")), "0.00")
      If Adodc2.Recordset.Fields("未税价报价人") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 15) = Adodc2.Recordset.Fields("未税价报价人")
      If Adodc2.Recordset.Fields("未税价报价时间") <> "" Then MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 16) = Adodc2.Recordset.Fields("未税价报价时间")
    End Sub最后,再一次由衷的感谢这位帮助我的朋友!
      

  6.   

    真头疼,我想来想去,我做了3个尝试,可这3个尝试都出现老毛病。我现在将这3个尝试贴出来,请高手们帮忙看看,这问题到底出在那里呢?谢谢了!尝试1:是不是在执行“AddItem”方法之前,MSHFlexGrid1表格的当前行位置不对呢?
         Dim a As Integer
         a=2
         If Adodc2.Recordset.RecordCount > 0 Then
           Adodc2.Recordset.MoveFirst
           Do While Adodc2.Recordset.EOF = False
             MSHFlexGrid1.Row = a
             Call drsj
             MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
             MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
             a = a + 1
             Adodc2.Recordset.MoveNext
           Loop
           MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
         End If
    尝试1:是不是在执行“AddItem”方法时,所要插入行的位置不对呢?
         Dim a As Integer
         a=3
         If Adodc2.Recordset.RecordCount > 0 Then
           Adodc2.Recordset.MoveFirst
           Do While Adodc2.Recordset.EOF = False
             Call drsj
             MSHFlexGrid1.AddItem "", a
             MSHFlexGrid1.Row = a
             a = a + 1
             Adodc2.Recordset.MoveNext
           Loop
           MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
         End If
    尝试3:Do While…Loop,是不是这个循环语句不对呢?我换一个循环语句看看。
         Dim a As Integer
         If Adodc2.Recordset.RecordCount > 0 Then
           Adodc2.Recordset.MoveFirst 
           For a = 1 To Adodc2.Recordset.RecordCount
           Call drsj
           MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1
           MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
           Adodc2.Recordset.MoveNext
           Next a
           MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)
         End If    我真的很菜,我这都是在瞎想,让高手们见笑了,请多多指教啊!
      

  7.   

    加几句debug.print,把mshflexgrid1的状态打印到立即窗口看看吧  Do While Adodc2.Recordset.EOF = False  '我断点设在这句上。
         debug.print "A rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
         Call drsj
         debug.print "B rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
         MSHFlexGrid1.AddItem "", MSHFlexGrid1.Row + 1 '第一遍执行循环是正常的,到了第2遍
         debug.print "C rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
         MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1       '的时候这两句没反应,第3遍开始又都好了。
         debug.print "D rows=";MSHFlexGrid1.Rows,"row=";MSHFlexGrid1.Row
         Adodc2.Recordset.MoveNext
      Loop
      

  8.   

    谢谢,谢谢这位朋友的热心帮忙!您让我懂得了立即窗口的作用,衷心的感谢您!现在我改用您的代码,设断点,按F8键逐句运行,观察立即窗口情况。在有问题的第2遍循环或第3遍循环(有时在第2遍,有时在第3遍),立即窗口里反映的是正常的,执行了“AddItem”方法后总行数有增加,下面那句移动当前行也正常。哎,可问题是,实际的MSHFlexGrid1表格里没有在执行“AddItem”方法时增加出一行空白行来,真是郁闷,气苦啊!为什么呢?另外,我又做了个尝试,我不用循环语句,直接用“Set MSHFlexGrid1.DataSource = Adodc2”来给MSHFlexGrid1表格赋值,虽然这样生成出来的表格样式不符合我的需要,我仅是做一下实验,看看情况,没想到,即使是这样竟然也发生同样的毛病,和循环语句一样,在表格上缺少了第2条记录或第3条记录。
      

  9.   

    我觉得你的row一直指向最后一行
    当你MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1),执行后你的row其实是向上推了一行的,你这样和additem肯定增加了,
    你只要在建立一个project,然后单做实验就知道了。
    MSHFlexGrid1.AddItem "" ‘这样就好了
    如果实在不行你就用 MSHFlexGrid1.rows=MSHFlexGrid1.rows+1
    什么叫第二次循环,第三次循环阿。是不是第二次或者第三次调用sxcx函数?你检查adoac.recordset.recordcount看看循环次数Ps: 我是女子,不是兄弟 :)
      

  10.   

    哇噻,这位大姐,哦不,可能是小姐,嗨,这年头小姐这称呼也不太好,总之,我今天28岁了,怎么称呼好咧?总之我现在高兴啊,解脱啊,高手就是高手啊,一语中地啊,还真就是那一句捣的鬼啊,“MSHFlexGrid1.RemoveItem (MSHFlexGrid1.Rows - 1)”,就这句罪魁祸首,虽然我现在还没有理解这句为什么会导致那样,但总算是把它揪出来了,高兴啊!我能够得到这位……这位朋友的帮助,还有另两位朋友的帮助,你们都是热心肠的朋友,我感到万分的荣幸!在此,我报上我的QQ号,76950746,希望能有幸和各位建立友谊!嘿嘿,其实是希望以后能够更便捷的来请教各位啦,哈哈!最后,因为我是首次来这里发贴请教,现在问题解决了,该怎么结贴啊,怎么给各位分数呢?还有,这个分数是怎么回事呢?是不是刚申请的用户名,系统赠送一定量的分数给我用……这样,那我可惨喽,因为我现在还是个低手,不能帮助大家,那我这分数只出不进,以后不是没得问了?
      

  11.   

    结帖的话,你就按"管理"那个menu,然后就知道了。我要分阿好像每次登陆都有点分吧,具体我就不知道了