高考考试网
当前位置: 首页 高考资讯

wpf报表怎么做(基于WPF重复造轮子)

时间:2023-08-06 作者: 小编 阅读量: 1 栏目名: 高考资讯

SmartSQL-一款方便、快捷的数据库文档管理工具项目背景公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码。在网上搜索关于数据库文档管理工具搜到最多的就是Screw和DBCHM,一个是基于Java的工具、另一个则是bug很多,表一多就一直转圈圈进不去。所以自己就动手开发了这款SmartSQL的工具。现在将它开源分享出来,供更多的小伙伴使用和参考学习。

SmartSQL - 一款方便、快捷的数据库文档管理工具

项目背景

公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码。需要理解旧的表的用途以及包含的字段的含义,表少还好说,但是表一多这就很浪费时间,而且留下来的文档都是残缺不全,每次查一些表的含义都要捯饬很久。在网上搜索关于数据库文档管理工具搜到最多的就是Screw和DBCHM,一个是基于Java的工具、另一个则是bug很多,表一多就一直转圈圈进不去。所以自己就动手开发了这款SmartSQL的工具。

它是一款基于.Net 4.6.1、WPF开发的一款数据库文档管理,不仅支持多种数据库(SQLServer、MySQL、PostgreSQL、SQLite)表、视图、存储过程的查询管理,还支持对其进行导出成离线文档,支持的文档包括CHM、Word、Excel、PDF、HTML、Xml、Json、MarkDown等多种格式。

现在将它开源分享出来,供更多的小伙伴使用和参考学习(文末附开源地址)。

技术栈
  • .Net 4.6.1
  • WPF
  • HandyControl
  • SqlSugar
  • AvalonEdit
  • SharpVectors

HandyControl是一款非常优秀的WPF框架,做出来的页面都很漂亮,所以我们选择使用它。Nuget中引用HandyControl:

引用HandyControl

一.菜单栏

菜单栏

然后我们要实现一个基于WPF边框上的菜单栏,刚好HandyControl中有这么一个菜单栏的控件,下面就是实现菜单栏的代码:

<hc:GlowWindow.NonClientAreaContent><StackPanelMargin="25,0,0,0"><Menu HorizontalAlignment="Left"><MenuItemx:Name="SwitchMenu"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="选择连接"><MenuItem.Icon><PathData="{StaticResource DownGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon><MenuItem.ItemTemplate><HierarchicalDataTemplate><MenuItemMargin="0"Padding="0"HorizontalAlignment="Left"VerticalAlignment="Stretch"Click="SwitchMenu_Click"Cursor="Hand"FontWeight="Normal"Header="{Binding ConnectName}"><MenuItem.Icon><svgc:SvgViewboxHorizontalAlignment="Left"IsHitTestVisible="False"Source="{Binding Icon}" /></MenuItem.Icon></MenuItem></HierarchicalDataTemplate></MenuItem.ItemTemplate></MenuItem><MenuItemName="MenuConnect"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="文件"><MenuItem.Icon><PathData="{StaticResource FileGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon><MenuItemName="AddConnect"Click="AddConnect_OnClick"FontWeight="Normal"Header="新建连接"><MenuItem.Icon><PathData="{StaticResource NewConnectGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="ImportMark"Click="ImportMark_OnClick"FontWeight="Normal"Header="导入备注"><MenuItem.Icon><PathData="{StaticResource ImportGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="ExportDoc"Click="ExportDoc_OnClick"FontWeight="Normal"Header="导出文档"><MenuItem.Icon><PathData="{StaticResource ExportGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem></MenuItem><MenuItemName="MenuGroup"Click="MenuGroup_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="分组"><MenuItem.Icon><PathData="{StaticResource GroupGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="MenuSetting"Click="MenuSetting_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="设置"><MenuItem.Icon><PathData="{StaticResource SettingGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="MenuAbout"Click="MenuAbout_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="关于"><MenuItem.Icon><PathData="{StaticResource InfoGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem></Menu></StackPanel></hc:GlowWindow.NonClientAreaContent><!--工具栏菜单-->

其中有个小插曲,在WPF中是默认不支持svg图形的,所以我们需要引用一个组件:SharpVectors,它的使用方法是这样的,引用svg界面需要引入下面语句:xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"然后引用要显示的svg图形:

<svgc:SvgViewboxHorizontalAlignment="Left"IsHitTestVisible="False"Source="{Binding Icon}" />

二.左侧菜单栏

然后就是左侧的菜单栏,我们要实现一个数据库的选择和数据库对象的搜索,可以搜索相关表、视图、存储过程等对象。首先我们要对我们的主界面进行一个简单的1:1:1的竖向布局,分别为左侧菜单栏、中间可以移动的分隔栏、右面的主界面:

<!--Main区域--><Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}"><Grid.RowDefinitions><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinitionMin /><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions></Grid>

现在我们要实现一个左侧树形的菜单栏,我们使用的是WPF里面的TreeView控件进行实现这样一个功能,下面是相关代码:

<DockPanel Grid.Row="0" Grid.Column="0"><hc:SimplePanel><BorderMargin="5,5,0,5"Background="{DynamicResource RegionBrush}"CornerRadius="{Binding CornerRadius}"><GridMargin="5"Background="Transparent"><TextBox x:Name="HidSelectDatabase" Visibility="Hidden" /><Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinitionMin /></Grid.ColumnDefinitions><ComboBoxx:Name="SelectDatabase"VerticalAlignment="Top"HorizontalContentAlignment="Stretch"hc:BorderElement.CornerRadius="5"hc:InfoElement.Placeholder="请选择数据库"Cursor="Hand"IsTextSearchEnabled="True"SelectionChanged="SelectDatabase_OnSelectionChanged"Text="{Binding DbName}"><ComboBox.ItemTemplate><DataTemplate><StackPanel VerticalAlignment="Center" Orientation="Horizontal"><ImageSource="/SmartSQL;component/Resources/Img/dataBase.ico" /><TextBlockMargin="5,0,0,0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding DbName}" /></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><ButtonName="BtnFresh"Grid.Column="2"Margin="0,0,0,0"Padding="4"VerticalAlignment="Top"Background="Transparent"BorderThickness="0"Click="BtnFresh_OnClick"Cursor="Hand"><Button.Content><Image Source="/SmartSQL;component/Resources/Img/Refresh.png" Stretch="Fill" /></Button.Content></Button></Grid><hc:SearchBarx:Name="SearchMenu"Margin="0,34,0,0"Padding="5,0,5,0"VerticalAlignment="Top"HorizontalContentAlignment="Stretch"hc:BorderElement.CornerRadius="5"hc:InfoElement.Placeholder="搜索数据表/视图/存储过程"FontShowClearButton="True"TextChanged="SearchMenu_OnTextChanged" /><TabControlx:Name="TabLeftType"Margin="0,65,0,40"SelectionChanged="TabLeftType_OnSelectionChanged"><TabItemx:Name="TabAllData"Cursor="Hand"Header="全部"IsSelected="True" /><TabItemx:Name="TabGroupData"Cursor="Hand"Header="分组"IsSelected="False" /><!--<TabItemx:Name="TabFavData"Cursor="Hand"Header="收藏"IsSelected="False" />--></TabControl><TreeViewx:Name="TreeViewTables"Margin="0,100,0,0"VerticalAlignment="Top"BorderThickness="0"ItemsSource="{Binding TreeViewData}"SelectedItemChanged="SelectedTable_OnClick"><TreeView.ItemContainerStyle><Style BasedOn="{StaticResource TreeViewItemBaseStyle}" TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="{Binding IsExpanded}" /><Setter Property="FontWeight" Value="{Binding FontWeight}" /><Setter Property="FontSize" Value="12" /><Setter Property="Visibility" Value="{Binding Visibility}" /><Setter Property="Foreground" Value="{Binding TextColor}" /><Setter Property="Cursor" Value="Hand" /><!--禁止水平滚动条自动滚动--><EventSetter Event="RequestBringIntoView" Handler="EventSetter_OnHandler" /><Style.Triggers><Trigger Property="IsSelected" Value="True"><Setter Property="FontWeight" Value="Bold" /></Trigger></Style.Triggers></Style></TreeView.ItemContainerStyle><TreeView.ContextMenu><!--右键菜单--><ContextMenu Visibility="Visible"><MenuItemx:Name="MenuSelectedItem"Padding="5,0,5,0"VerticalAlignment="Center"Click="MenuSelectedItem_OnClick"Cursor="Hand"Header="复制对象名" /></ContextMenu></TreeView.ContextMenu><TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type models:TreeNodeItem}" ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"><svgc:SvgViewboxMargin="0,0,5,0"HorizontalAlignment="Left"Source="{Binding Icon}" /><TextBlockVerticalAlignment="Center"FontText="{Binding DisplayName}"ToolTip="{Binding DisplayName}" /></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView><Gridx:Name="NoDataText"Margin="0,100,0,5"HorizontalAlignment="Stretch"Background="White"Cursor="Arrow"><local:NoDataAreax:Name="NoDataAreaText"Margin="0"HorizontalAlignment="Center"ShowType="All" /></Grid><GridMargin="0"VerticalAlignment="Bottom"Visibility="Hidden"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Grid><ComboBoxx:Name="CbTargetConnect"VerticalAlignment="Bottom"HorizontalContentAlignment="Left"hc:InfoElement.Placeholder="目标连接"Cursor="Hand"DisplayMemberPath="ConnectName"IsTextSearchEnabled="True"SelectedValuePath="DbMasterConnectString"SelectionChanged="CbTargetConnect_OnSelectionChanged"/></Grid><Grid Grid.Column="1" Margin="5,0,0,0"><ComboBoxx:Name="CbTargetDatabase"MinVerticalAlignment="Bottom"HorizontalContentAlignment="Left"hc:InfoElement.Placeholder="目标数据库"Cursor="Hand"IsTextSearchEnabled="True"/></Grid><Grid Grid.Column="2"><!--差异比较按钮--><Buttonx:Name="BtnCompare"Margin="5,5,0,0"HorizontalAlignment="Right"hc:BorderElement.CornerRadius="6"hc:IconElement.Geometry="{StaticResource CompareGeometry}"Click="BtnCompare_OnClick"Content="差异比较"Cursor="Hand" /></Grid></Grid><!--数据加载Loading--><hc:LoadingLinex:Name="LoadingLine"Margin="0,0,0,0"Visibility="Collapsed" /></Grid></Border></hc:SimplePanel></DockPanel>

在这里我没有详细介绍底层c#的相关代码,里面逻辑有些复杂感兴趣的可以去我的开源项目中学习。在上面的左侧菜单代码中,我们使用的不仅有TreeView控件、也有ContextMenu、hc:LoadingLine等控件,还有自己写的自定义控件。

其实WPF要比WinForm好用不少,不仅支持MVVM数据绑定还支持灵活的页面渲染,自从用了WPF再也不用WinForm了。

今天分享暂时到这里,下一篇讲介绍DataGrid表格数据绑定及相关条件搜索。下面是工具的开源地址,感兴趣的可以Clone下来学习一下。码砖不易,喜欢的麻烦点下Star.

开源地址

SmartSQL: 一款方便、快捷的数据库文档查询、生成工具,支持SqlServer/MySql/PostgreSQL/SQLite数据库表结构文档查询、生成;导出文档支持CHM、Word、Excel、PDF、Html、Xml、Json、MarkDown等多种格式。

,
    推荐阅读
  • 黄冈地区有哪几个县市(湖北黄冈市1区2市7县)

    罗田县建成区面积22.5平方公里麻城市麻城市位于市区的北部地区,和安徽省、河南省接壤。麻城市是黄冈市辖区面积最大的县级行政区,西南部为平原,其余地区都是大山区。城区建在金沙河水库东部地区,倒水河两岸的丘陵处。辖区的东北部多山,靠长江的西南部为平原。武穴市建成区面积40.8平方公里黄梅县黄梅县位于市区的最东南部地区,和江西省、安徽省接壤。黄冈市各区县市建成区面积排名表表中面积的单位是平方公里。

  • nga玩家社区哪个有意思(多玩游戏论坛倒了)

    也就是说,尽管NGA可以汇聚大量的魔兽精英玩家,但还是有相当多的未注册用户不能亲身参与讨论,较高的准入门槛让他们无处解答疑问、讨论游戏成果,甚至发泄不满。而在这个再选择的过程中,多玩游戏论坛的存在完美地承接了这部分需求。离开了NGA不能水贴、不能讨论金团等诸多限制,魔兽玩家在多玩论坛虽然尚且不能为所欲为,但也足够放飞自我了。可这点,即便是《魔兽世界》也无法做到。诚如多玩论坛公告所言,互联网时代风云变化。

  • 哪些人不宜吃白菜(白菜的介绍)

    大白菜性偏寒凉,胃寒腹痛、气虚胃寒、大便溏泻及寒痢者不可多食白菜是我国原产蔬菜,有悠久的栽培历史据考证,在我国新石器时期的西安半坡原始村落遗址发现的白菜籽距今约有6000年-7000年,我来为大家科普一下关于哪些人不宜吃白菜?以下内容希望对你有帮助!据考证,在我国新石器时期的西安半坡原始村落遗址发现的白菜籽距今约有6000年-7000年。明代李时珍引陆佃《埤雅》说:“菘,凌冬晚凋,四时常见,有松之操,故曰菘,今俗谓之白菜。”

  • 世界十大未解之谜大揭秘(世界三大未解之谜)

    因为瀑布的周围常有一道彩虹出现,他们就将此瀑布定名为彩虹瀑布。根据当时科学家解释,这是冰人奥兹,也就是迄今世界上最古老的木乃伊,至少有5300多年历史。而且当时的冰人奥兹尸体被下有神秘离奇的冰人诅咒,以至于在发现这具尸体后,接触过其尸体的人前后死亡七人,他们均参与了奥兹的研究。

  • 快时尚品牌现在怎么样了(美国快时尚巨头FOREVER)

    但到2019年4月,品牌关闭了中国官网和天猫旗舰店等线上渠道,线下门店也陆续关闭。2019年9月,成立35年的FOREVER21宣布申请破产保护,此后被美国财团收购。虽然路途坎坷,但这家品牌显然不愿放弃中国市场,终于在今夏回归。FOREVER21品牌官方目前并未回应。今年以来,ZARA每个月的起售价比去年同期进一步提高。近期,ZARA母公司Inditex集团发布了截至2022年4月30日的第一财季业绩,其收入增长36%,净利润同比大幅增长80%,毛利率达到60.1%,是10年来最高水平。

  • 枣阳县的简介(襄阳枣阳介绍)

    枣阳市版图总面积3277平方千米,截至2016年末,下辖3个街道、12个镇,全市总人口114.06万。枣阳是汉光武帝刘秀的故里,汉城、境内有新石器时期雕龙碑古人类遗址、九连墩战国楚墓、白水寺等文化遗存。316国道,汉十高速,枣潜高速直穿而过,以及规划的方城到枣阳高速使枣阳交通更加便利。

  • 东台市城建项目(盐城东台重点项目成了烂尾工程)

    东台市政府会办纪要明确要求二期工程的交地工作要在7月底完成,8月底完成拆迁,由城东新区负责申报,东台市国土局按程序挂牌。为此,东台市政府还成立了由近20家单位组成的建设协调领导小组。沿海国际迟迟不能开业运行,购买商铺的业主、租赁户、项目建设方、借款的朋友、银行纷纷对夏克春提起诉讼,夏克春此时已经债务缠身,成了“老赖”。

  • 英国音响品牌推荐(全球知名音响品牌介绍)

    英国音响品牌推荐这几十来年,全球音响界风起云涌,品牌无数。排序并非排名,更非实力。但是,英国音响品牌众多,历史悠久,实力不俗。B&W鹦鹉螺音箱B&W高端801音箱B&W805音箱二、Harbeth雨后初晴英国雨后初晴Harbeth,英国著名音箱品牌,全球著名的“BBC音响”。其声音极具韵味,中频尤其迷人,播放人声和古典音乐极有美感。主持人StewartTyler以其不朽的Tablette而论,绝对是天才设计大师无疑。Tyler的设计最早有意识地提出了追求音场重视的目标。

  • 2022广州萤火虫漫展在哪里买票(萤火虫漫展只在广州吗)

    2022广州萤火虫漫展在哪里买票?门票:80元/人购票入口:“虫娘小卖部”微信小程序“萤火虫动漫游戏嘉年华广州站28th”确认定档啦!举办时间为2022年7月15日~7月18日,举办地点为广州琶洲保利世贸博览馆,地址为广州市海珠区新港东路1000号。一位购买展会门票的家长仅可携带一位1.2米以下儿童免票入场,其余须购票入场。禁止携带宠物入场。如因恶劣天气或不可抗力等原因,导致比赛、活动、见面会无法进行,恕不退票。