網絡採集軟件核心技術剖析系列(7)---如何使用C#語言搭建程序框架(經典Winform界面,頂部菜單欄,工具欄,左邊樹形列表,右邊多Tab界面)

一 本系列隨筆概覽及產生的背景html

本身開發的豆約翰博客備份專家軟件工具問世3年多以來,深受廣大博客寫做和閱讀愛好者的喜好。同時也不乏一些技術愛好者諮詢我,這個軟件裏面各類實用的功能是如何實現的。node

該軟件使用.NET技術開發,爲回饋社區,現將該軟件中用到的核心技術,開闢一個專欄,寫一個系列文章,以饗廣大技術愛好者。git

本系列文章除了講解網絡採編發用到的各類重要技術以外,也提供了很多問題的解決思路和界面開發的編程經驗,很是適合.NET開發的初級,中級讀者,但願你們多多支持。github

不少初學者常有此類困惑,「爲何我書也看了,C#相關的各個方面的知識都有所瞭解,但就是無法寫出一個像樣的應用呢?」,數據庫

這其實仍是沒有學會綜合運用所學知識,鍛煉出編程思惟,創建起學習興趣,我想該系列文章也許會幫到您,希望如此。編程

開發環境:VS2008瀏覽器

本節源碼位置:https://github.com/songboriceboy/SimpleFrameWork網絡

源碼下載辦法:安裝SVN客戶端(本文最後提供下載地址),而後checkout如下的地址:https://github.com/songboriceboy/SimpleFrameWork框架

系列文章提綱以下:函數

二 第七節主要內容簡介(如何使用C#語言搭建程序框架(經典Winform界面,頂部菜單欄,工具欄,左邊樹形列表,右邊多Tab界面))

如何使用C#語言搭建程序框架(經典Winform界面,頂部菜單欄,工具欄,左邊樹形列表,右邊多Tab界面)的解決方案,演示demo以下圖所示:可執行文件下載

demo功能簡介:

程序啓動後,掃描程序所在目錄的WebSiteDB文件夾(參見上一節,裏面保存着各個博主的所有博文,xxx.db文件),在左邊的樹形控件上加載數據庫名稱;雙擊樹形控件的某個子節點,在右邊新增一個相似瀏覽器的tab界面,在新打開的界面中,自動加載博主的博文列表信息。

 

三 基本原理

這個簡單框架,主要有3個比較重要的地方:

1.樹形控件節點的遞歸加載;

2.右邊tab窗體的建立(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll);

3.點擊樹形節點,打開新窗口(前2者的結合)。

 首先來看第一點,樹形控件節點的遞歸加載,主要代碼以下

    private void LoadWebSiteTree()
        {
            this.treeViewTask.Nodes.Clear();
            TreeNode nodeRoot = new TreeNode();
            nodeRoot.Text = "站點列表";
            nodeRoot.Tag = -1;
            this.treeViewTask.Nodes.Add(nodeRoot);

            GetSubDirectoryNodes(nodeRoot, m_strDBFolder,true);
            this.treeViewTask.SelectedNode = this.treeViewTask.TopNode;
        }

建立根節點,而後調用GetSubDirectoryNodes函數,遞歸地加載子節點:

  private void GetSubDirectoryNodes(TreeNode parentNode, string fullName, bool getFileNames)
        {
            if (!Directory.Exists(fullName))
            {
                Directory.CreateDirectory(fullName);
            }
            DirectoryInfo dir = new DirectoryInfo(fullName);
            DirectoryInfo[] dirSubs = dir.GetDirectories();

            // 爲每一個子目錄添加一個子節點
            foreach (DirectoryInfo dirSub in dirSubs)
            {
                // 不顯示隱藏文件夾
                if ((dirSub.Attributes & FileAttributes.Hidden) != 0)
                {
                    continue;
                }

               
                TreeNode node = new TreeNode();
                node.Text = dirSub.Name;

                node.Tag = 0;
                node.ImageIndex = 0;
                parentNode.Nodes.Add(node);

                // 遞歸調用
                GetSubDirectoryNodes(node, dirSub.FullName, getFileNames);
             

            }
            // 爲每一個子目錄添加一個子節點
            foreach (DirectoryInfo dirSub in dirSubs)
            {
                // 不顯示隱藏文件夾
                if ((dirSub.Attributes & FileAttributes.Hidden) != 0)
                {
                    continue;
                }

            }
            if (getFileNames) // 書中源碼中,這部分在foreach內部,不正確
            {
                // 獲取此節點的全部文件
                FileInfo[] files = dir.GetFiles();

                // 放置節點後。放置子目錄中的文件。
                foreach (FileInfo file in files)
                {
                    if (file.Extension.ToString() != ".db")
                        continue;
                    string strNodeName = file.Name.Remove(file.Name.Length - 3, 3);
                    if (strNodeName == "home")
                        continue;
                    
                    TreeNode node = new TreeNode();
                    node.Text = strNodeName;

                    node.Tag = 1;
                    node.ImageIndex = 1;
                    parentNode.Nodes.Add(node);
                }
            }
        }  

接下來看第二點,2.右邊tab窗體的建立(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll),主要代碼以下:

public DockContent ShowContent(string caption/*, Type formType*/)
        {

            DockContent frm = FindDocument(caption);

            if (frm == null)
            {
                Frm_TargetUrlView frm_TargetUrlView = new Frm_TargetUrlView((string)this.treeViewTask.SelectedNode.Parent.Text
                    , m_strDBConStringPath + m_strTreeNodeName
               ,  (string)this.treeViewTask.SelectedNode.Text, this);
                frm_TargetUrlView.MdiParent = this;
                frm_TargetUrlView.WindowState = FormWindowState.Maximized;
                frm_TargetUrlView.Show(this.dockPanel1);
                frm_TargetUrlView.Focus();
                frm_TargetUrlView.BringToFront();
                return frm_TargetUrlView;
            }

            frm.Show(this.dockPanel1);
            frm.Focus();
            frm.BringToFront();
            return frm;
        }

首先調用FindDocument(caption),判斷當前tab窗口是否已經打開了,若是已經打開,則激活它;若是還未打開,新建一個tab窗口,並使這個剛建立的窗口成爲激活窗口。

 3.點擊樹形節點,打開新窗口(前2者的結合)。主要代碼以下:

  private void treeViewTask_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Point pos = new Point(e.X, e.Y);
            TreeNode nodeClick = this.treeViewTask.GetNodeAt(pos);
            if (nodeClick.Text == "站點列表")
            {

                this.treeViewTask.ContextMenuStrip = null;
                return;
            }
            if (nodeClick != null && e.Button == MouseButtons.Left)
            {
                int nTag = (int)nodeClick.Tag;
                if (nTag == 0)
                    return;
                this.treeViewTask.SelectedNode = nodeClick;

                LoadInfoByNode();

            }

            ShowContent(this.treeViewTask.SelectedNode.Text);
        }

在樹形節點的鼠標雙擊處理函數中,調用上面第二步的ShowContent函數,彈出對應的tab窗體。

更詳細的代碼請自行下載研究。

做者: 宋波
出處: http://www.cnblogs.com/ice-river/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,往後必有一番做爲!旁邊有「推薦」二字,你就順手把它點了吧,相得準,我分文不收;相不許,你也好回來找我!
相關文章
相關標籤/搜索