Foxtable(狐表)用户栏目专家坐堂 → TreeView的菜单怎么从多个表去获取呢?


  共有5522人关注过本帖树形打印复制链接

主题:TreeView的菜单怎么从多个表去获取呢?

帅哥哟,离线,有人找我吗?
toplyz
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:90 积分:730 威望:0 精华:0 注册:2014/2/17 16:27:00
TreeView的菜单怎么从多个表去获取呢?  发帖心情 Post By:2014/2/18 11:18:00 [只看该作者]

TreeView的菜单怎么从多个表去获取呢?

 回到顶部
帅哥哟,离线,有人找我吗?
lsy
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/2/18 11:23:00 [只看该作者]

用SQL多表查询,得到一个DataTable,根据这个表生成目录树。


 回到顶部
帅哥哟,离线,有人找我吗?
toplyz
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:90 积分:730 威望:0 精华:0 注册:2014/2/17 16:27:00
  发帖心情 Post By:2014/2/18 11:44:00 [只看该作者]

就是想问一下这个SQL语句怎么写,怎么达到多表查询出来的结果是个合集

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178530 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/2/18 11:45:00 [只看该作者]

那至少你也要有表和文件发出来啊, 凭空怎么写?

 回到顶部
帅哥哟,离线,有人找我吗?
小刚
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
  发帖心情 Post By:2014/2/18 11:48:00 [只看该作者]

用SQL语句设计加载树

Foxtable内置了加载树功能,可以轻松地管理大容量数据。
本节我们将自行编写代码设计一个加载树,
并非多此一举,毕竟有时我们会有一些特殊的要求,内置的加载树不一定能满足我们的需要。

本示例可以参考CaseStudy目录下的文件“动态加载演示.Table”
假定你有一个订单表,也许有几百个产品,上十万个订单,那么将其全部载入到Foxtable中是不现实的。
下面我们将设计一个目录树列出所有的产品和客户,当我们双击某个产品或客户时,自动加载对应的订单。

实现这样的功能,其实很简单:

1、首先参考限制初始加载量,使得打开项目的时候,订单表不会加载任何数据。

本示例使用的是内部数据表,为了初始不加载任何定订单数据,我们在项目事件BeforeLoadInnerTable设置了如下的代码:

If e.DataTableName = "订单" Then
    e.Filter = "[_Identify] Is Null"

End
If

2、然后新建一个窗口,窗口中插入一个目录树(TreeView),窗口的AfterLod事件代码设为:

Dim cmd As New SQLCommand
Dim
dt As DataTable
cmd
.CommandText = "SELECT DISTINCT 产品,客户 From {订单}"
dt
= cmd.ExecuteReader()
Dim
trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv
.BuildTree(dt,"产品|客户")
trv
.Nodes.Insert("加载所有数据",0)

这样一旦打开窗口,该目录树列出所有的产品和客户。
由于订单表只是加载了部分数据,所以我们不能直接根据订单表来生成目录树,因为订单表的数据不完整,只能用ExecuteReader方法直接从后台提取完整的产品和客户数据。
注意Select语句中,一定要有DISTINCT关键词,这样返回的才是不重复的产品和客户名单,虽然对目录树的生成没有影响,但是会大大降低数据加载量,对于网络环境,这是非常重要的。

3、最后将目录树的NodeMouseDoubleClick事件设为:

Dim Filter As String
If
e.node.Text = "加载所有数据" Then
    Filter = ""

Else

    Dim dr As DataRow = e.Node.DataRow '获取生成此节点的DataRow
   
Select Case e.Node.Level
        Case 0
            Filter ="[
产品] = '" & dr("产品") & "'"
        Case 1
            Filter ="[
产品] = '" & dr("产品") & "' And [客户] = '" & dr("客户") & "'"
    End Select

End
If
DataTables
("订单").LoadFilter = Filter
DataTables
("订单").Load()

这样我们只需双击某个节点,既可动态加载对应的订单。


 回到顶部
帅哥哟,离线,有人找我吗?
toplyz
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:90 积分:730 威望:0 精华:0 注册:2014/2/17 16:27:00
回复:(Bin)那至少你也要有表和文件发出来啊, 凭空怎...  发帖心情 Post By:2014/2/18 11:54:00 [只看该作者]

有两张表{金磨坊}和{金嘉福},他们的字段都是一样的,我要这两个表中取得工厂,类别,和材质这3个字段,
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.CommandText = "SELECT DISTINCT 工厂,类别,材质 From {金嘉福}"
dt = cmd.ExecuteReader()
Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv.BuildTree(dt,"工厂|类别|材质")
trv.Nodes.Insert("加载所有数据",0)
这样只能取得一张表的生产一个菜单,我要生成多个工厂的菜单

 回到顶部
帅哥哟,离线,有人找我吗?
小刚
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
  发帖心情 Post By:2014/2/18 12:00:00 [只看该作者]

先把两张表合并,再产生目录树。思路应该是这样的。

 回到顶部
帅哥哟,离线,有人找我吗?
小刚
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
  发帖心情 Post By:2014/2/18 12:01:00 [只看该作者]

数据填充器

Filler用于从表中提取数据,并填充到另一个表中。

属性:

  • SourceTable

    数据来源表。
     
  • SourceCols

    数据来源列,不同的列用逗号分割。
     
  • DataTable

    数据接收表。
     
  • DataCols

    数据接收列,不同的列用逗号分割。
     
  • ExcludeExistValue

    逻辑型,设为True,排除接收表中已经存在的内容。
     
  • ExcludeNullValue

    逻辑型,设为True,排除空白值。
     
  • Filter

    填充条件,
    请参考表达式的运算符和函数条件表达式
     
  • Distinct

    逻辑型,是否排除重复内容,默认为True;如果设为False,将不会排除重复内容,也不会排除已有内容和空白值。
     
  • Append

    逻辑型,默认为True,在接收表中增加新行用于接收数据,设为False,则在原有的行中填充,如果不够再增加新行。

提示:数据来源列和数据接收列是可以省略的,或者只设置其中一个,Filler会自动查找同名列进行匹配填充。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/2/18 12:33:00 [只看该作者]

将:

 

cmd.CommandText = "SELECT DISTINCT 工厂,类别,材质 From {金嘉福}"

 

改为:

 

cmd.CommandText = "SELECT DISTINCT 工厂,类别,材质 From {金嘉福} UNION ALL SELECT DISTINCT 工厂,类别,材质 From {另一个表}"

 

建议看看:

http://www.foxtable.com/help/topics/0688.htm

 

 

 

[此贴子已经被作者于2014-2-18 12:33:48编辑过]

 回到顶部