<a href="http://kb.cnblogs.com/page/47339">基于.NET平台的Windows程式設計實戰(一)——前言</a>
<a href="http://kb.cnblogs.com/page/47340">基于.NET平台的Windows程式設計實戰(二)—— 需求分析與資料庫設計</a>
<a href="http://kb.cnblogs.com/page/47342">基于.NET平台的Windows程式設計實戰(四)—— 資料庫操作類的編寫</a>
<a href="http://kb.cnblogs.com/page/47403">基于.NET平台的Windows程式設計實戰(五)—— 問卷管理功能的實作</a>
<a href="http://kb.cnblogs.com/page/47404">基于.NET平台的Windows程式設計實戰(六)—— 題目管理功能的實作</a>
OK!下載下傳了DockPanel控件後,我們将其(即WeifenLuo.WinFormsUI.Docking.dll檔案)COPY到前面建立的QuestionnaireSystem項目中的bin檔案夾中,并添加到項目的引用中去,方法如下:右擊項目名稱或右擊“引用”-à“添加引用……”,在彈出的對話框中選擇浏覽頁籤,并找到剛才COPY到項目中的WeifenLuo.WinFormsUI.Docking.dll檔案,點“确定”即可,如下圖5-1所示:
圖5-1
DockPanel引入成功後,我們便可以将其做為放到工具箱中像其它控件一樣使用了,下面我們将其添加到工具箱:在左邊工具箱下面的空白處右擊-à“選擇項”-à在彈出的對話框中點選“浏覽”并找到COPY到項目中的WeifenLuo.WinFormsUI.Docking.dll并打開,之後如下圖5-2所示,再點選“确定”,即可發現左邊的工具箱下面多了個DockPanel控件,這表示添加成功了。
圖5-2
打開之前我們建立的主視窗MainFrom,并把剛才添加到工具箱的DockPanel控件拉到其界面的空白處,将其Name屬性設為dockPanel,并點選如下圖5-3所示的“在父容器中停靠”,使其停靠到父容器中。
圖5-3
好!打住!主視窗MainFrom的設定先到這裡,後面我們再接着設定。
下面我們先來建立一個母視窗吧,以便之後各視窗繼承。方法:右擊項目名-à“添加”-à“Windows窗體”,在彈出的對話框中進入“SurveryWin”,點“确定”即可,如下圖5-4所示:
圖5-4
并設定如下屬性:
BackColor:White
Icon:設定成項目檔案夾Images中的logo.ico圖檔
Text:設為空,也可以不設
之後,往窗體中拉入一個ContextMenuStrip控件,将其Name設為” CMenuStrip”,并在其第一個子項目上輸入“關閉”,如下圖5-5所示:
圖5-5
之後,在“關閉”上輕按兩下,進入代碼編輯器,将其代碼改寫成如下所示:
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;//引入第三方開源控件DockPanel類庫
namespace LJ_QuestionnaireSystem
{
//将這裡的預設繼承From改成DockContent,以使其繼承于第三方控件的DockContent類
public partial class SurveryWin : DockContent
public SurveryWin()
InitializeComponent();
}
/**////
/// 以便使用者右擊視窗标題時進行關閉目前視窗
///
private void 關閉ToolStripMenuItem_Click(object sender, EventArgs e)
this.Close();//關閉目前視窗
}
}
到這裡,母視窗算是建立好了,下面就讓我們分别來建立問卷添加、問卷編輯、預覽問卷、問卷管理四個視窗,依次命名為SurveyAdd、SurveyModify、SurveyPreview、SurveyManage,(建立方法同上面的母視窗的建立一樣,在此以及以後的課程中将不再多說),并都使其繼承于SurveyWin母視窗,繼承的方法也與上面一樣,将對應類後面繼承的From改成SurveyWin即可,下面以SurveyAdd視窗為例進行講解說明:
原來為:
public partial class SurveyAdd :From
現在改成:
public partial class SurveyAdd :SurveryWin
之後,往SurveyAdd視窗中拉入相應的控件,并設定成如下圖5-6所示,具體的屬性設定請下載下傳下面的本課程源碼進行檢視:
圖5-6
其對應的代碼改成如下所示:
using System.Windows.Forms;
{
public partial class SurveyAdd :SurveryWin
public SurveyAdd()
BindDataSurvey();//綁定問卷清單
DbOperate dboperate = new DbOperate();//執行個體化一個資料庫操作對象,用于操作資料
/**////
/// 添加問卷
private void SAddBtn_Click(object sender, EventArgs e)
string SName = SNameText.Text.Trim();//擷取輸入的問卷名
string isExistSv = "Select Count(id) From Lj_Survey Where Survey_Name='" + SName + "'";
string SPople = SPopleText.Text.Trim();//擷取輸入的發起者
int OutCount = Convert.ToInt32(OutCountTxt.Text.Trim());//擷取輸入的發放份數
DateTime dtime = SDTimePicker.Value;//擷取發放時間
string sql = "Insert into Lj_Survey (survey_Name,survey_Sponsor,survey_OutCount,survey_DateTime) ";
sql += " values('" + SName + "','" + SPople + "'," + OutCount + ",'" + dtime.ToShortDateString() + "')";
if (SName == "" || SPople == "")//判斷是否輸入了問卷名及發起者,如果沒有,則提示
MessageBox.Show("請輸入問卷名稱或發起者!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else if (dboperate.ExcuteScrSql(isExistSv) > 0)//判斷輸入的問卷是否已經存在,如存在,則提示
//MessageBox.Show("已存在此問卷,請重新輸入問卷名!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IsExistSLab.Visible = true;
else
IsExistSLab.Visible = false;
if (Convert.ToInt32(dboperate.ExcuteIntSql(sql)) > 0) //如果執行成功,則提示成功,反之提示失敗
if (MessageBox.Show("添加成功!請重新整理清單!是否繼續添加?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
SurveyCancel();//清空所填資料
SListBox.Items.Clear();//清空綁定的問卷項
BindDataSurvey();//重新綁定問卷
}
else
this.Close(); //關閉目前視窗
}
else
MessageBox.Show("添加失敗!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
private void SCancelBtn_Click(object sender, EventArgs e)
SurveyCancel();//清空所填資料
/// 綁定問卷清單
private void BindDataSurvey()
string surveySql = "Select Survey_Name From Lj_Survey";//查詢問卷的SQL語句
DataTable sdt = dboperate.GetDataTable(surveySql);//擷取問卷資料表
if (sdt.Rows.Count > 0) //如果問卷存在,則執行如下操作
Object[] items = new object[sdt.Rows.Count];//執行個體化一個對象數組,用于存放讀出的問卷名
for (int i = 0; i < sdt.Rows.Count; i++) //循環讀出問卷名
items[i] = (i + 1) + "." + sdt.Rows[i][0].ToString();
SListBox.Items.AddRange(items);//将問卷名綁定到SlistBox控件上
/// 清空所填資料
private void SurveyCancel()
SNameText.Text = "";
SPopleText.Text = "";
OutCountTxt.Text = "0";
private void SNameText_MouseLeave(object sender, EventArgs e)
//查詢輸入的問卷名是否已經存在,如果存在,則給出提示
if (dboperate.ExcuteScrSql(isExistSv) > 0)
以上的代碼在這裡就不用再進行講解了吧,上面的注釋已經寫的很清楚了^_^
至于其它三個視窗的設定,與上面的大同小異,就不一一列出來了,請大家自行下載下傳下面的本課程源碼進行對照設定吧。
建立好各視窗後,讓我們再回到主視窗MainFrom中來進行相對應的關聯設定吧!
先在MianFrom中引入DockPanel,如下所示:
using WeifenLuo.WinFormsUI.Docking;
再分别給主菜單 “問卷”下面的子選項以及工具欄中的:“添加問卷”與“問卷管理” 添加Click事件及ItemClick事件,并寫一個用來查找已打開視窗的方法FindDocument(string text),用來判斷哪些視窗已經打開了,哪些視窗還沒有打開,具體代碼如下所示:
/// 在dockPanel中查找已經打開的視窗
/// 傳入的視窗标題
/// 傳回的視窗
private IDockContent FindDocument(string text)
if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi)
foreach (Form form in MdiChildren)
if (form.Text == text)
return form as IDockContent;
return null;
foreach (IDockContent content in dockPanel.Documents)
if (content.DockHandler.TabText == text)
return content;
private void SNTStripMenuItem_Click(object sender, EventArgs e)
SurveyAdd sadd = new SurveyAdd();
sadd.ShowDialog();
/// 問卷管理
private void SToolStripMenuItem_Click(object sender, EventArgs e)
//判斷問卷管理視窗是否已經打開了,如果沒有打開,則打開,否則将将焦點移到問卷管理視窗上
if (FindDocument("問卷管理") == null)
SurveyManage sm = new SurveyManage();
sm.Show(dockPanel);
Form f = FindDocument("問卷管理") as Form;
f.Focus();
/// 工具菜單
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
if (e.ClickedItem == SMaTooScriptBtn)
SToolStripMenuItem_Click(null, null);
else if (e.ClickedItem == SAddToolScriptBtn)
SNTStripMenuItem_Click(null, null);
最後,我們修改一下主視窗的Load事件,以便啟動系統時能打開問卷管理視窗,代碼如下所示:
private void MainForm_Load(object sender, EventArgs e)
{
sm.Show(this.dockPanel);