以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]限制增加行数  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=117321)

--  作者:chnfo
--  发布时间:2018/4/10 17:06:00
--  [求助]限制增加行数
如何限制一个表中,满足特定条件的情况的新增行数不超过指定的行数?

在beforeadddatarow事件中可以这样。
Dim count As Integer = DataTables("入库明细").Compute("count(_Identify)", "入库单编号 = \'" & Tables("入库").Current("入库单编号") & "\'")
If count >= 100 Then
    e.Cancel = True
End If

但如果在日常工作-增加行-增加多行中,直接输入200,也能增加200行。
怎么样既可以利用这个增加多行的功能,又能限制最多100行呢?

不是要自己定制一个窗口吧………………
[此贴子已经被作者于2018/4/10 17:14:50编辑过]

--  作者:有点甜
--  发布时间:2018/4/10 17:17:00
--  

DataRowAdded事件,写代码

 

e.datarow.delete


--  作者:chnfo
--  发布时间:2018/4/10 17:40:00
--  
这是个什么用法?
遍历再删除?

--  作者:有点甜
--  发布时间:2018/4/10 17:42:00
--  
DataRowAdded事件
 
Dim count As Integer = DataTables("入库明细").Compute("count(_Identify)", "入库单编号 = \'" & Tables("入库").Current("入库单编号") & "\'")
If count >= 100 Then
    e.datarow.delete
End If

--  作者:chnfo
--  发布时间:2018/4/10 21:59:00
--  
我倒,加入了DataRowAdded事件之后,使用日常工作-增加行-多行,输入120时,直接报出错误:
.NET Framework 版本:2.0.50727.8762
Foxtable 版本:2018.3.9.1
错误所在事件:
详细错误信息:
此行已从表中移除并且没有任何数据。BeginEdit() 将允许在此行中创建新数据

但是没有提示错误所在的事件,实在难找。代码太多了。这咋查啊。

单独地建一个项目,独立测试这个功能,倒是没有问题。
我把这个表的其它所有事件全部注释掉,仍然会报出这个错误。


事件如下:
Dim n As Integer = e.DataTable.Compute("count(_Identify)", "AID = \'" & x & "\'")   ‘x是全局代码
If n > 10 Then
systemready = False 
    e.DataRow.delete
MessageBox.Show("删除成功")
systemready = True 
End If

在日常工作-增加行,输入12,执行时,先提示“删除成功”,说明多的行确实是删除了,但是接下来就是上面的报错。
报错窗口点击确定之后,在表中仍然加了设定的10行空行。

-----也就是报出错误,但是结果仍然是正确的。
[此贴子已经被作者于2018/4/10 22:06:16编辑过]

--  作者:有点蓝
--  发布时间:2018/4/10 22:37:00
--  
就是有其它代码影响了。如果检查不到是什么代码
1、导入系统菜单,修改新增行菜单按钮代码,添加判断的代码
2、使用窗口按钮,添加判断的代码

--  作者:chnfo
--  发布时间:2018/4/11 1:12:00
--  
自己做了个窗口,代码如下:

Dim t As Table = Tables("X")
t.StopRedraw()
systemready = False
t.AddNew(val(e.Form.Controls("TextBox1").text))
t.DataTable.Save()
systemready = True


If t.Rows.Count > 10 Then
    For i As Integer = t.Rows.count - 1 To 10 Step -1
        t.Rows(i).Delete()
    Next
End If

t.ResumeRedraw()

执行又不会报任何错误。理论上讲,应当也会报错才对。

--  作者:有点蓝
--  发布时间:2018/4/11 9:12:00
--  
直接判断可以添加的行数
Dim cnt As Integer = 10 - val(e.Form.Controls("TextBox1").text)
If cnt > 0 Then
    Dim t As Table = Tables("X")
    t.AddNew(cnt)
Else
    msgbox("已满10条记录")
End If

--  作者:chnfo
--  发布时间:2018/4/11 9:26:00
--  
高见。
只是我很疑惑,直接做一个窗口来这样就可以,为什么在 datarowadded事件中就会报错呢。

而且我把表X除了beforeadddatarow、 datarowadded之外的表事件全部注释掉了,仍然会报错,但关闭报错窗口之后,仍然可以有正确的结果。

这样可能更合适一点,因为表X中可能已经有数据行了。
Dim t As Table = Tables("TbCon.TbL")
Dim cnt As Integer = math.min(10 - t.Rows.count, val(e.Form.Controls("TextBox1").text))
If cnt > 0 Then
    t.AddNew(cnt)
End If
[此贴子已经被作者于2018/4/11 9:46:56编辑过]

--  作者:有点蓝
--  发布时间:2018/4/11 9:48:00
--  
这个具体有项目测试过才知道是什么原因了