可能很简单:在数据窗口的itemchanged事件中判断是否保存输入某个字段的值,若不保存,如何恢复到编辑之前的值?

时间:2022-08-04 15:05:29
运行时,在数据窗口一个字段中输入数据,当焦点从该字段转移时,通过messagebox来提示用户是否保存向该字段输入的值,假如选的是“否”,则在焦点转移后,将该字段显示的值恢复到编辑之前的值,例如该字段原来的值是“first value”,但编辑时输入了“test”这样的值,现在在不保存的情况下将焦点转移后,显示的值仍是“test”,请问怎么让它恢复为“first value”?

26 个解决方案

#1


up

#2


dw_1.object.original.columnname[rowno]

#3


刚才写错了,
dw_1.object.columnname.original[rowno]
columnname为字段的名称
rowno为行号
这个值为初始,未做改动的值

#4


谢谢回答!只是不知道怎么用?要得到未编辑之前该字段的值容易,现在的问题是当不想保存时,在焦点转移后如何将该字段值还原到修改之前的值?

#5


lostfocus事件中写代码,还原回来不行吗?

#6


不能够在lostfocus中写,因为在该数据窗口内字段间焦点的转移时就要提示保存,而lostfocus好象是整个数据窗口失去焦点时才触发?

#7


sorry,错了
应该在Itemfocuschanged事件中可以吧

#8


Itemfocuschanged也达不到效果

#9


为什么不行,你的messagebox不是在这个事件中吗?
根据它的返回值,就可以接下来写代码,还原了啊

#10


return 2就还原了

#11


To:唐朝
试过return 2,但不灵! :(, 各位能不能帮测试一下,谢谢了!

#12


取到原来值,然后setitem()回去自动保存下呢

#13


那是你代码中强行付值了,所以不能返回,你用massagebox判断的时候用itemcheng的dwo.name和data来判断,不行就return2 行就return0

#14


同意使用强制赋值的方法,在进行录入之前首先记录内容,如果要还愿就强制赋值。
也可以用 ItemChanged event (DataWindows)
这是 sybase的文档
Set the return code to affect the outcome of the event:

0  (Default) Accept the data value
1  Reject the data value and do not allow focus to change
2  Reject the data value but allow the focus to change

For information on setting the return code in a particular environment, see "About return values for DataWindow events".

#15


我试过了可以的,
学习

#16



我知道问题的关键了,是因为在写上面这些之前用了accepttext(),但是不用accepttext()好象又不行?各位再试一试在前面加上的accepttext()的情况,结果会不同的

#17


在itemchanged事件中return 1就可以了,其中不能用accepttext()

#18


这样,当用户选择了要保存时再用accepttext(),否则先不accepttext()。不这样的话自然return不回去。

#19


PB的数窗表达式中不允许两个like用and连接,它认为这样的表达式不合法。如果必须用两个like就得用sql语句的方式了。

如果用那两个值作判断,最稳妥的办法是先将这两个值分别取到存放在两个变量中,然后用组合字符串的方式构造setfilter()里的表达式语句,这样就可以避免两个like用and连接的情况,比用sql语句的方式简单些

#20


对不起,贴错地方了~:P

#21


但是,假如该字段原来的内容是空的,然后运行时输入一些值再将焦点转移,如果不用accepttext()的话,好象它不会提示?
我是用GetItemStatus来获得它的状态的

#22


不会啊,Itemchanged事件中是明确不能用accepttext()的,否则就会出怪问题。

#23


而且你想要他提示什么,
如果你要在焦点跳转后,回复原值就return 2

#24


你直接在Itemchanged()事件下写messagebox('','')试下,原来空白输入内容后焦点转移时它一定会提示的。
一般只在保存前、删除前,或需要提取当前值用于计算、判断时才会使用accepttext()。并且一般都要紧贴于保存、删除、取值的代码之前放置。当未确定保存时不用它是完全没有问题的。只要内容改变并移开焦点,必然触发这一事件。

#25


在数据窗口的itemchanged事件中加入类似如下代码:
ll_rt=messagebox("提示", "确实将第" + string(row) +"行工时" + string(this.getitemdecimal(row, "gs", primary!, true)) +"修改为" +data +"吗?", information!, yesno!, 2)

if ll_rt = 1 then
     return 0 //确实修改
else
     return 2    //不修改
end if

#26


不会别人用这种办法都行,就你不行吧?

#1


up

#2


dw_1.object.original.columnname[rowno]

#3


刚才写错了,
dw_1.object.columnname.original[rowno]
columnname为字段的名称
rowno为行号
这个值为初始,未做改动的值

#4


谢谢回答!只是不知道怎么用?要得到未编辑之前该字段的值容易,现在的问题是当不想保存时,在焦点转移后如何将该字段值还原到修改之前的值?

#5


lostfocus事件中写代码,还原回来不行吗?

#6


不能够在lostfocus中写,因为在该数据窗口内字段间焦点的转移时就要提示保存,而lostfocus好象是整个数据窗口失去焦点时才触发?

#7


sorry,错了
应该在Itemfocuschanged事件中可以吧

#8


Itemfocuschanged也达不到效果

#9


为什么不行,你的messagebox不是在这个事件中吗?
根据它的返回值,就可以接下来写代码,还原了啊

#10


return 2就还原了

#11


To:唐朝
试过return 2,但不灵! :(, 各位能不能帮测试一下,谢谢了!

#12


取到原来值,然后setitem()回去自动保存下呢

#13


那是你代码中强行付值了,所以不能返回,你用massagebox判断的时候用itemcheng的dwo.name和data来判断,不行就return2 行就return0

#14


同意使用强制赋值的方法,在进行录入之前首先记录内容,如果要还愿就强制赋值。
也可以用 ItemChanged event (DataWindows)
这是 sybase的文档
Set the return code to affect the outcome of the event:

0  (Default) Accept the data value
1  Reject the data value and do not allow focus to change
2  Reject the data value but allow the focus to change

For information on setting the return code in a particular environment, see "About return values for DataWindow events".

#15


我试过了可以的,
学习

#16



我知道问题的关键了,是因为在写上面这些之前用了accepttext(),但是不用accepttext()好象又不行?各位再试一试在前面加上的accepttext()的情况,结果会不同的

#17


在itemchanged事件中return 1就可以了,其中不能用accepttext()

#18


这样,当用户选择了要保存时再用accepttext(),否则先不accepttext()。不这样的话自然return不回去。

#19


PB的数窗表达式中不允许两个like用and连接,它认为这样的表达式不合法。如果必须用两个like就得用sql语句的方式了。

如果用那两个值作判断,最稳妥的办法是先将这两个值分别取到存放在两个变量中,然后用组合字符串的方式构造setfilter()里的表达式语句,这样就可以避免两个like用and连接的情况,比用sql语句的方式简单些

#20


对不起,贴错地方了~:P

#21


但是,假如该字段原来的内容是空的,然后运行时输入一些值再将焦点转移,如果不用accepttext()的话,好象它不会提示?
我是用GetItemStatus来获得它的状态的

#22


不会啊,Itemchanged事件中是明确不能用accepttext()的,否则就会出怪问题。

#23


而且你想要他提示什么,
如果你要在焦点跳转后,回复原值就return 2

#24


你直接在Itemchanged()事件下写messagebox('','')试下,原来空白输入内容后焦点转移时它一定会提示的。
一般只在保存前、删除前,或需要提取当前值用于计算、判断时才会使用accepttext()。并且一般都要紧贴于保存、删除、取值的代码之前放置。当未确定保存时不用它是完全没有问题的。只要内容改变并移开焦点,必然触发这一事件。

#25


在数据窗口的itemchanged事件中加入类似如下代码:
ll_rt=messagebox("提示", "确实将第" + string(row) +"行工时" + string(this.getitemdecimal(row, "gs", primary!, true)) +"修改为" +data +"吗?", information!, yesno!, 2)

if ll_rt = 1 then
     return 0 //确实修改
else
     return 2    //不修改
end if

#26


不会别人用这种办法都行,就你不行吧?