系列文章導航:
基于.NET平臺的Windows編程實戰(一)——前言
基于.NET平臺的Windows編程實戰(二)—— 需求分析與數據庫設計
基于.NET平臺的Windows編程實戰(四)—— 數據庫操作類的編寫
基于.NET平臺的Windows編程實戰(五)—— 問卷管理功能的實現
基于.NET平臺的Windows編程實戰(六)—— 題目管理功能的實現
首先,為了使我們的界面更加便于操作及布局,我們引入第三開源控件DockPanel[當然也可以不引入控件而直接進行開發],你可以從這里:DockPanel控件 下載其編譯好的DLL文件,也可以從這里:http://sourceforge.net/projects/dockpanelsuite 進行下載。關于DockPanel控件的相關資料大家可以去http://sourceforge.net/projects/dockpanelsuite 或上網查找相關資料進行了解,本項目系統只是用其來進行界面布局方面的操作,至于其它方面的功能不作研究討論,有興趣的朋友可以去http://sourceforge.net/projects/dockpanelsuite 上下載其源碼來進行研究。
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
其對應的代碼改成如下所示:

Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace LJ_QuestionnaireSystem


{
public partial class SurveyAdd :SurveryWin

{
public SurveyAdd()

{
InitializeComponent();
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)

{
string SName = SNameText.Text.Trim();//獲取輸入的問卷名
//查詢輸入的問卷名是否已經存在,如果存在,則給出提示
string isExistSv = "Select Count(id) From Lj_Survey Where Survey_Name='" + SName + "'";
if (dboperate.ExcuteScrSql(isExistSv) > 0)

{
//MessageBox.Show("已存在此問卷,請重新輸入問卷名!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IsExistSLab.Visible = true;
}
else

{
IsExistSLab.Visible = false;
}

}
}
}
以上的代碼在這里就不用再進行講解了吧,上面的注釋已經寫的很清楚了^_^
至于其它三個窗口的設置,與上面的大同小異,就不一一列出來了,請大家自行下載下面的本課程源碼進行對照設置吧。
創建好各窗口后,讓我們再回到主窗口MainFrom中來進行相對應的關聯設置吧!
先在MianFrom中引入DockPanel,如下所示:
using WeifenLuo.WinFormsUI.Docking;
再分別給主菜單 “問卷”下面的子選項以及工具欄中的:“添加問卷”與“問卷管理” 添加Click事件及ItemClick事件,并寫一個用來查找已打開窗口的方法FindDocument(string text),用來判斷哪些窗口已經打開了,哪些窗口還沒有打開,具體代碼如下所示:

Code

/**////
/// 在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;
}
else

{
foreach (IDockContent content in dockPanel.Documents)
if (content.DockHandler.TabText == text)
return content;

return null;
}
}

/**////
/// 添加問卷
///
///
///
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);
}
else

{
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)

{
SurveyManage sm = new SurveyManage();
sm.Show(this.dockPanel);
}
附,本課程源碼下載