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

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

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

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等多种格式。

,
    推荐阅读
  • 可视人流和无痛人流的区别 无痛可视人流和无痛人流的区别

    可视人流可视人流是在特殊B超仪器设备准确定位下所进行的无痛人工流产手术。可视人流可视无痛人流术适应于任何已怀孕女性。可视人流的优缺点1.优点:无痛人流采用静脉麻醉,迅速进入睡眠状态,痛苦小,手术时间较短,术后恢复较快。不可视人流由于不能直视,盲操作可能导致人流不全,损伤子宫等情况出现,但是由经验丰富的医师主刀也可以有效避免此类问题。

  • 洋生姜怎么腌制(洋生姜腌制方法介绍)

    下面希望有你要的答案,我们一起来看看吧!洋生姜怎么腌制食材:生姜适量。所有调料加水煮开,再晾凉。把晾好的洋姜放在保鲜盒里。先加一层保鲜膜,再盖好盖子,放到阴凉的地方,腌制一个星期以上。吃的时候,把洋姜切成细丝,加点熟芝麻,再淋点酱油、醋和香油。

  • 给男朋友甜到炸的情话(给男朋友萌到炸的情话超甜)

    给男朋友甜到炸的情话?“快看我的眼睛,进东西了?”“胡说,里面明明有我喜欢的人。”“知道你和猴子有什么区别吗?”“不,猴子住在山洞里,而你住在我心里。”经允许,擅自喜欢你,不好意思。你还想要一个妈妈嘛,我把我妈妈分给你。我本来是要行走江湖的,但遇见你我觉得可以先停一停。我真的十分喜欢你,嘴上一分,眼里两分,心里七分。今年的冬天可真冷,得随时把你抱在怀里才能过活。我吃了太多盐,闲的总去想你呀。

  • 懂球号一月红黑榜(精帖红黑懂球帝)

    因为多特蒙德的成色还没有经历过特别深入的检验。对对手战术的无所适从,攻防两端的一无所长,领先被扳平或反超后的六神无主,最终被打的面目全无。这就是如今的米兰,不要说库兹卡的表现堪称惊艳,也不要说巴洛特利的状态略有回暖。命硬程度堪比12赛季阿莱格里的米哈,在续命多次之后,这一次没有继续书写他的神奇,而米兰欧联杯的席位在一系列拙劣表现之后,似乎又陷入了岌岌可危的状态。米兰,本身就是光荣的代名词。

  • 月经里不能吃什么食物(来月经不能吃的食物)

    女性朋友在月经期间,加强营养的同时,还需要注意一些食物是不宜吃的在月经期间不能吃冷饮、巧克力、辛辣食物,如果吃了这些食物,会导致月经量发生变化,加重痛经,另外,咖啡、碳酸饮料,也是不能吃的这段期间要多吃一些含有铁元素和蛋白质的食物,这样对自己的身体是非常好的,下面我们就来聊聊关于月经里不能吃什么食物?这段期间要多吃一些含有铁元素和蛋白质的食物,这样对自己的身体是非常好的。

  • 怎么有效的改善法令纹(怎么改善法令纹)

    许多女孩希望改善法令纹。法令纹的形成一般从20岁开始,到30岁后会形成中度的法令纹,每个人的个人情况,法令纹的深度也不同,有不同程度的法令纹,需要不同的方法来改善,我们需要区别对待。如何改善法令纹1、面部按摩日常护肤时,辅以面霜或乳液,用指腹按摩脸部。

  • 西安228路公交车路线(具体介绍)

    西安228路公交车路线西安公交228路属于西安市公共交通总公司第三公司一车队,从岳家寨公交调度站开往北门外,运行时间为首班6:00、末班00:00。配车数量为30部空调车,线路全程14公里,票价为两元一票制。

  • 现在有哪些值得推荐的网游(六本经典的网游佳作)

    尽管这也是一本爽文,但也是一本技术流,将盗贼应该有的谨慎态度与精巧技艺表现的淋漓尽致。大体上身患绝症的主角为了抓住一线希望进入这个游戏,然后在不同的副本中不断变强,挖掘其中的奥秘。曾经有很多经典的网游文,包括失落叶的三部曲,蝴蝶兰的全职高手,火星引力的修罗传说等等都有着众多的书友以及不小的影响力。

  • 别克gl8高端mpv(最保值十大MPV别克GL8位居TOP1)

    随着MPV细分市场关注度越来越高,保有量也是日益增长。最近有关机构公布了MPV3年的保值率排行,排名第一的车型依然是别克GL8,位居2、3位的是本田艾力绅与奥德赛两兄弟,但前10内还是有几款自主品牌MPV,具体情况如何,下面就来看一看。虽然说传祺M6在此榜单中已排到末尾,但它以三年保值率60.73%位居中国品牌MPV榜第三位,也是很好的成绩了,相比2021年也有了大幅跃升。

  • 适合情侣三日游的地方(适合情侣三日游的地方有哪些?)

    适合情侣三日游的地方黄山情人谷。而翡翠谷是黄山脚下最长的一道峡谷,在峡谷中,有茂密的竹林,有泉水叮咚的妙音,有奇异美丽的岩石,有光彩照人的彩池,每一样都让人感觉心旷神怡,很适合情侣一起去观赏。鼓浪屿被评为我国最美的五大城区之首,融合了国内与国外的建筑风格,还有南普陀寺,中国最美的校园厦门大学、北辰山、金光湖等景点,足够与他一起留下欢声笑语了。