首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何在数据窗口中像Excel中那样选择并复制、删除多行数据 [已结贴,结贴人:dx0]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2007-12-07 08:44:29 楼主
    客户以前的系统是用Access做的,用习惯了,现在还要保持这种操作方式,我一点头绪都没有,恼火啊。
    80  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jlwei888
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      4

      2

    发表于:2007-12-07 09:02:581楼 得分:5
    当然有,
    有行复制,列取值等函数,
    点SQL图标,进语法编辑器中,菜单中有个distinct  去重复行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 09:22:422楼 得分:0
    晕,我的意思是在运行窗口中操作,能像在OFFice那样方便
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jlwei888
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      4

      2

    发表于:2007-12-07 09:38:253楼 得分:0
    我也晕!

    要想实现相应的功能,就要编写相应事件!得编程~

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sdhylj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2007-12-07 09:41:504楼 得分:10
    选择和删除可以,复制比较麻烦了.
    选择多行,在数据窗口的clicked事件里面写如下代码:
    SQL code
    if row = 0 then return if this.IsSelected(row) then this.SelectRow(row,false) else this.SelectRow(row,true) end if

    删除多行,添加一个按钮,写如下代码:
    SQL code
    long ll_row ll_row = dw_1.GetSelectedRow(0) do while ll_row > 0 dw_1.DeleteRow(ll_row) ll_row = dw_1.GetSelectedRow(0) loop dw_1.Update()
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sdhylj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2007-12-07 10:17:315楼 得分:5
    复制的话用clipboard()函数操作,自己取出所有列的值,拼接成一个字符串,clipboard(拼接的字符串变量)就放到剪贴板里了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 12:29:046楼 得分:40
    参照PFC行选择服务源码自己写。
    给部分代码你参照:
    1,创建用户对象:n_rowselection(integer ai_xpos,integer ai_ypos,long al_row,dwobject adwo_obj) return integer
    2,增加两事件:ue_clicked()和ue_rowfocuschanged(long al_row) return integer

    3,定义实例变量:

    u_dw idw_edit

    Protected:
    // 选择方式1/单行,2/多行,3/扩展方式(Ctrl/Shift)
    Int ii_style = 1

    //当前行
    Long il_row 

    //扩展方式选取时用的起始行
    Long il_anchorrow

    //键盘选择,上下方向键选取(u_dw)的rowfocuschanged()事件
    boolean ib_keyboard = True

    4,新建相关函数:
    of_keybrowselect(long al_row) return integer
    //==============================================================================
    // 描述: 键盘选择(不支持多行连续选择)
    //------------------------------------------------------------------------------
    // 参数:
    // long al_row (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-12
    //==============================================================================

    Integer li_rc

    Choose Case ii_style
    Case 1
    li_rc = of_RowSelectSingle(al_row)
    Case 2
    // No Action.
    Case 3
    li_rc = of_KeyBRowSelectExt(al_row, KeyDown(keycontrol!), KeyDown(keyshift!))
    End Choose

    Return li_rc
    of_keybrowselecttext(long al_row,boolean ab_cntrl,boolean ab_shift) return integer
    //==============================================================================
    // 描述: 键盘选择(扩展方式)
    //------------------------------------------------------------------------------
    // 参数:
    // long  al_row  (当前行)
    // boolean ab_cntrl (Ctrl键)
    // boolean ab_shift (Shift键)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-12
    //==============================================================================

    Integer li_i

    If al_row <= 0 Then Return -1

    il_row = 0

    If ab_shift Then
    idw_edit.SelectRow(0, False)
    If il_anchorrow = 0 Then
    idw_edit.SelectRow (al_row, True)
    Else
    idw_edit.SetRedraw (False)
    If il_anchorrow > al_row Then
    For li_i = il_anchorrow To al_row Step -1
    idw_edit.SelectRow(li_i, True)
    Next
    Else
    For li_i = il_anchorrow To al_row
    idw_edit.SelectRow(li_i, True)
    Next
    End If
    idw_edit.SetRedraw(True)
    End If
    ElseIf ab_cntrl Then
    //No Action
    Else
    of_RowSelectSingle(al_row)
    il_anchorrow = al_row
    End If

    If idw_edit.GetRow() <> al_row Then
    idw_edit.SetRow(al_row)
    End If

    Return 1

    of_register(u_dw adw_edit) return integer
    //==============================================================================
    // 描述: 注删行选择服务的u_dw
    //------------------------------------------------------------------------------
    // 参数:
    // value u_dw          adw_edit  (数据窗口对象)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-10
    //==============================================================================

    idw_edit = adw_edit

    Return 1
    of_rowselect(long al_row) return integer
    //==============================================================================
    // 描述: u_dw.clicked()事件行选择.
    //      ii_style:1/单行选择,2/多行选择(要求关闭ib_keyboard),3/扩展方式.
    //------------------------------------------------------------------------------
    // 参数:
    // long al_row (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-12
    //==============================================================================

    Int  li_rc

    Choose Case ii_style
    Case 1
    li_rc = of_RowSelectSingle(al_row)
    Case 2
    li_rc = of_RowSelectMulti(al_row)
    Case 3
    li_rc = of_RowSelectExt(al_row, KeyDown(keycontrol!), KeyDown(keyshift!))
    End Choose

    Return li_rc


    of_rowselecttext(long al_row) return integer
    //==============================================================================
    // 描述: 扩展方式选取行(Ctrl/Shift)
    //------------------------------------------------------------------------------
    // 参数:
    // value long  al_row  (当前行)
    // value boolean ab_cntrl (Ctrl键按住)
    // value boolean ab_shift (Shift键按住)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-11
    //==============================================================================

    Int li_i

    If al_row <= 0 Then Return -1

    If ab_cntrl And ab_shift = False Then
    idw_edit.SelectRow (al_row, Not (idw_edit.IsSelected(al_row)))
    // 起始行
    il_anchorrow = al_row
    ElseIf ab_cntrl Or ab_shift Then
    If ab_cntrl = False Then
    idw_edit.SelectRow (0, False)
    End If

    If il_anchorrow = 0 Then
    idw_edit.SelectRow (al_row, True)
    Else
    idw_edit.SetRedraw ( False )
    If il_anchorrow > al_row Then
    For li_i = il_anchorrow To al_row Step -1
    idw_edit.SelectRow(li_i, True)
    Next
    Else
    For li_i = il_anchorrow To al_row
    idw_edit.SelectRow(li_i, True)
    Next
    End If

    idw_edit.SetRedraw ( True )
    End If
    Else
    of_RowSelectSingle(al_row)
    il_anchorrow = al_row
    End If

    If idw_edit.GetRow() <> al_row Then
    idw_edit.SetRow(al_row )
    End If

    Return 1

    of_rowselectmulti(long al_row) return integer
    //==============================================================================
    // 描述: 多行选取(要求关闭:ib_keyboard)
    //------------------------------------------------------------------------------
    // 参数:
    // value long al_row (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-11
    //==============================================================================

    If al_row <= 0 Then Return -1

    idw_edit.SelectRow(al_row,  Not (idw_edit.IsSelected(al_row)))

    If idw_edit.GetRow() <> al_row Then
    idw_edit.SetRow ( al_row )
    End If

    Return 1


    of_rowselectsingle(long al_row) return integer
    //==============================================================================
    // 描述: 单行选取
    //------------------------------------------------------------------------------
    // 参数:
    // value long al_row (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-11
    //==============================================================================

    If al_row < 0 Then Return -1

    idw_edit.SelectRow(0, False)
    idw_edit.SelectRow(al_row,True)

    If idw_edit.GetRow() <> al_row Then
    idw_edit.SetRow(al_row)
    End If

    Return 1

    of_setstyle(integer ai_style) return integer

    //==============================================================================
    // 描述: 设定行选择风格,1/单行选取,2/多行选取,3/扩展方式(Ctrl/SHift)
    //------------------------------------------------------------------------------
    // 参数:
    // value integer ai_style (行选取方式)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-11
    //==============================================================================

    ii_style = ai_style

    Return 1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 12:35:207楼 得分:0
    参照PFC行选择服务源码自己写。
    给部分代码你参照:
    1,创建用户对象:n_rowselection(integer  ai_xpos,integer  ai_ypos,long  al_row,dwobject  adwo_obj)  return  integer
    2,增加两事件:ue_clicked()和ue_rowfocuschanged(long  al_row)  return  integer

    //-------------------------------------------------------------
    对不起写错了!请改为:

    1,创建用户对象:n_rowselection
    2,增加两事件:
    ue_clicked(integer  ai_xpos,integer  ai_ypos,long  al_row,dwobject  adwo_obj)  return  integer
    ue_rowfocuschanged(long  al_row)  return  integer
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 12:37:448楼 得分:0
    1,ue_clicked(integer      ai_xpos,integer      ai_ypos,long      al_row,dwobject      adwo_obj)    return      integer

    //==============================================================================
    // 描述: 单击事件,由u_dw的clicked()事件调用.
    //------------------------------------------------------------------------------
    // 参数:
    // value integer ai_xpos (当前单击位置x)
    // value integer ai_ypos (当前单击位置y)
    // value long    al_row  (当前行)
    // value dwobject adwo_obj (当前dwo)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-11
    //==============================================================================

    If IsNull(adwo_obj) Then Return -1
    If al_row <= 0 Then Return -1

    // 记住当前行
    il_row = al_row

    Return of_RowSelect(al_row)


    2,ue_rowfocuschanged(long      al_row)      return      integer 
    //==============================================================================
    // 描述: u_dw.rowfocuschanged()事件调用时的处理,ib_keyboard支持键盘选择.
    //------------------------------------------------------------------------------
    // 参数:
    // value long al_row (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  integer
    //------------------------------------------------------------------------------
    // 日期: 2007-07-12
    //==============================================================================

    Int li_rc = 1

    If ib_keyboard Then
    li_rc = of_KeybRowSelect(al_row)
    End If

    Return li_rc


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 12:41:329楼 得分:0
    在u_dw.clicked()事件里写:
    //==============================================================================
    // 描述: clicked()获得当前行,如果已开启行服务则调用该服的ue_clicked()事件.
    //------------------------------------------------------------------------------
    // 参数:
    // integer xpos (x座标)
    // integer ypos (y座标)
    // long    row (行号)
    // dwobject dwo (dwo数据窗内部Object)
    //------------------------------------------------------------------------------
    // 返回值:  long
    //------------------------------------------------------------------------------
    // 日期: 2007.06.28
    //==============================================================================

    If row > 0 Then
    This.SetRow(row)
    End If

    If IsValid (inv_rowselect) Then
    inv_rowselect.Event ue_clicked(xpos, ypos, row, dwo)
    End If


    在u_dw.rowfocuschanged()事件里写:
    //==============================================================================
    // 描述: 链接服务开启时刷新详项数据和行选择服务滚动
    //------------------------------------------------------------------------------
    // 参数:
    // long currentrow (当前行)
    //------------------------------------------------------------------------------
    // 返回值:  long
    //------------------------------------------------------------------------------
    // 日期: 2007.07.10
    //==============================================================================

    If currentrow > 0 Then
    If IsValid(inv_linkage) Then
    inv_linkage.of_retrievedt(currentrow)
    End If
    If IsValid (inv_rowselect) Then
    inv_rowselect.Event ue_rowfocuschanged(currentrow)
    End If
    End If


    剩下的你自己看着办。


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ayouaja
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-07 17:14:4610楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-10 10:46:4611楼 得分:0
    谢谢zzxing及各位朋友,我仔细再研究一下。我觉得能完美解决这个问题,意义很大。希望各位继续跟进,我这有几千分,可以慢慢分给大家。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-10 10:47:3612楼 得分:0
    这两天Girlfriend来了,一直没关注这个,不好意思。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lllyyymmm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-10 12:46:5413楼 得分:0
    重色轻友
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • leiguo1985
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-10 14:28:3614楼 得分:0
    zzxing
    看你这个类,新写的,想看看,做个用ctrl或shift加鼠标的多选,但没做过用键盘
    能不能将你的类发到我邮箱,多谢!!!!!!
    向你学习一下呵!!!!!!
    leiguo1985@163.com
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-10 22:02:5815楼 得分:0
    整个PBL给你发过来了,共同学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-11 09:22:3916楼 得分:0
    不是重色亲友,这年头找个自己有感觉而且对自己有感觉的MM真不容易。不好好珍惜,不行啊。

    zzxing,发一个给我好吗?谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-11 09:23:2417楼 得分:0
    晕,忘了留邮箱了。
    duanxl@cqupt.edu.cn
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-11 11:13:5318楼 得分:0
    晕,忘了留邮箱了。
    duanxl@cqupt.edu.cn


    -----------------------------
    已发.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mjw_sh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-12 17:06:5719楼 得分:10
    解决这个问题其实非常简单,把表里面增加一个区别字段,在选择的时候就赋值,然后过滤,删除,更新,就没了,我就是这么用的,包括在众多的记录中选择打印
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dx0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-12 17:27:0320楼 得分:0
    选择和删除都很简单,关键是对所选记录进行复制和粘贴。没那么容易的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanglv
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-13 09:31:0921楼 得分:10

    li_rowcount=dw_1.rowcount()
    if li_rowcount <1 then return



    if li_rowcount <1 then return
    for li_row = li_rowcount to 1 step -1 

    if dw_1.isselected(li_row) then
    li_num +=1
    li_rowcount1 +=1
    dw_1.RowsCopy(li_row, li_row, Primary!, dw_1, li_rowcount1, Primary!)
    end if
    next


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hylaeion
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-12-15 23:37:2622楼 得分:0
    复制和粘贴是不是考虑用动态数据窗口呢,
    可具体的业务中就不好办了,字段什么的都有实际意义的啊。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhe7919
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-30 08:27:0523楼 得分:0
    引用 19 楼 mjw_sh 的回复:
    解决这个问题其实非常简单,把表里面增加一个区别字段,在选择的时候就赋值,然后过滤,删除,更新,就没了,我就是这么用的,包括在众多的记录中选择打印

    我也有类似问题待解决啊!看了你的方法,觉得你太聪明了!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved