【合作】总是弹出"不能为空"的提示

        在做组合查询时,不同的条件下,要判断不同的框"不能为空",在上一篇博客中说了如何判读文本框和组合框不能为空的问题,感觉这下就简单了,直接定义不能为空的控件数组,再调用方法就OK啦,可以省去很多MessageBox的使用。但是想的越简单越是出问题,具体如下:

        【知识点】

        组合查询中如何判读文本框和组合框是否为空,引用判读是否为空的方法确实简单,根据不同的条件,判读哪些不能为空。

        首先需要每一行定义一个过程,用来判断哪些框不能为空:

1.定义第一个过程Rdim(),作用是初始化第一行结构体数组:

<span style="font-size:18px;"><span style="font-size:18px;">Private Sub Rdim()
        '定义数组维数
        ReDim Preserve arrayControl(3)  
        '初始化数组
        arrayControl(0) = New element(cmbFieldBox1, "字段名")
        arrayControl(1) = New element(cmbMarkBox1, "操作符")
        arrayControl(2) = New element(txtContentBox1, "查询内容")
End Sub</span></span>

        2.定义第二个过程Rdim1(),作用是初始化第二行结构体数组:

<span style="font-size:18px;">Private Sub Rdim1()
        '定义数组维数
        ReDim Preserve arrayControl(3)
        '初始化数组
        arrayControl(0) = New Element(cmbFieldBox2, "字段名")
        arrayControl(1) = New Element(cmbMarkBox2, "操作符")
        arrayControl(2) = New Element(txtContentBox2, "查询内容")
    End Sub</span>

 
 

        3.定义第三个过程Rdim2(),作用是初始化第三行结构体数组:

<span style="font-size:18px;">Private Sub Rdim2()
        '定义数组维数
        ReDim Preserve arrayControl(3)
        '初始化数组
        arrayControl(0) = New Element(cmbFieldBox3, "字段名")
        arrayControl(1) = New Element(cmbMarkBox3, "操作符")
        arrayControl(2) = New Element(txtContentBox3, "查询内容")
    End Sub</span>

 
 

        4.在点击查询时,哪些框不能空,直接调用上面的过程即可。代码如下:

<span style="font-size:18px;"><span style="font-size:18px;">      '当两个组合关系都为空时, 第一行不能为空
        If cmbRelationBox1.Text.Trim = "" Then
            '首先调用Rdim()过程第一行进行数组初始化
            Call Rdim()
            '再调用 IsSomeEmptyText()函数,检查是否有空值
            If IsSomeEmptyText(arrayControl) Then
                Exit Sub
            End If
        '当第一个组合关系不为空第二个为空时, 前两行不能为空
        ElseIf cmbRelationBox2.Text.Trim = "" Then
            '首先调用Rdim()和Rdim2()过程,前两行进行数组初始化
            Call Rdim()
            Call Rdim1()
            If IsSomeEmptyText(arrayControl) Then
                Exit Sub
            End If
        '当两个组合关系都不为空时, 三行都不能为空
        Else
            '首先调用Rdim()/Rdim1()/Rdim2()过程,三行进行数组初始化
            Call Rdim()
            Call Rdim1()
            Call Rdim2()
            If IsSomeEmptyText(arrayControl) Then
                Exit Sub
            End If
        End If</span></span>
        感觉这样写完,条理清晰,逻辑正确,肯定没问题,但是一运行发现问题了。按着上面判断的过程将组合框点第一遍没有问题,但是当再使两个组合关系为空,后两行不可用时,出现如下问题:

        从代码中可以明确的看出,当组合关系1为空时,只判断第一行是否有空值。从上图也可看到,组合关系1确实为空,而且第一行已经没有空值。所以当时就想不通了,为什么还会提示”不能为空!"呢。逻辑判断出了问题吗?整来整去,感觉没有问题。那问题出哪儿了?最后把目标锁定到了“ReDim Preserve”。

        ReDim Preserve是什么,不就是定义数组大小维数的吗?之前也没细想,不懂了还是要问问度娘。

        ReDim 为数组变量重新分配存储空间。可选项修饰符 Preserve 当仅更改最后一个维度的大小时,用来保留现有数组中的数据。使用 ReDim 语句来更改某个已声明数组的一个或多个维度的大小。如果有一个较大的数组,并且您不再需要它的某些元素,ReDim 可通过减小数组大小来释放内存。另一方面,如果代码确定某个数组需要更多元素,ReDim 也可以添加它们。

        简单点说,ReDim是重新定义数组的大小,修饰符 Preserve 使数组中已赋值的那些数据不被清空,这也就能说明我上面的问题了。当第一次调用三行的Rdim后,数据被赋值,就不能被清空了,即使控件里被清空了,但是实际还是会显示“不能为空!"的提示。

        所以解决办法也很简单,把ReDim Preserve arrayControl(3) 的修饰符Preserve去掉就OK了。

        【小结】

        其实问题并不难,但是开始遇到会想不明白为什么会出现这个问题,总是觉得哪儿哪儿都没问题,从逻辑上来讲自己是想不通的,其实这时候就需要停下来好好想想,既然觉得逻辑没问题,那问题会出在哪儿。肯定是自己不太熟悉的地方,只是用到了,并不是很了解的的地方。就像上面的问题,如果真的理解ReDim Preserve估计就不会出现这样的问题了吧。


你可能感兴趣的:(数组,preserve,ReDim)