本人做Winform開發多年,孜孜不倦,略有小成,其中收集或者自己開發一些常用的東西,基本上在各個項目都能用到的一些開發經驗及知識積累,現逐漸介紹一些,以飨讀者,共同進步。
1、視窗【×】關閉按鈕變為最小化,并在托盤提示資訊
一般有些管理系統,為了防止客戶随意關閉程式或者基于其他原因,一般會把 視窗【×】關閉按鈕變為最小化,如大家熟悉的飛信、MSN等等,但是有些不是很熟悉的客戶,最小化到托盤的時候,卻不知道程式到了那裡去了,是以,最小化的時候,伴随一個氣泡提示資訊,顯得有一定的必要,如下截圖所示。
首先在主窗體的設計界面中添加一個NotifyIcon控件,然後實作相關的代碼即可。
下面列出一些關鍵的代碼出來,大家看了應該就知道如何實作了
private void notifyMenu_Show_Click(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Maximized;
this.Show();
this.BringToFront();
this.Activate();
this.Focus();
}
else
this.WindowState = FormWindowState.Minimized;
this.Hide();
}
private void notifyMenu_Exit_Click(object sender, EventArgs e)
{
try
this.ShowInTaskbar = false;
Portal.gc.Quit();
catch
// Nothing to do.
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
notifyMenu_Show_Click(sender, e);
private void MainForm_MaximizedBoundsChanged(object sender, EventArgs e)
this.Hide();
/// <summary>
/// 縮小到托盤中,不退出
/// </summary>
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
//如果我們操作【×】按鈕,那麼不關閉程式而是縮小化到托盤,并提示使用者.
if (this.WindowState != FormWindowState.Minimized)
e.Cancel = true;//不關閉程式
//最小化到托盤的時候顯示圖示提示資訊,提示使用者并未關閉程式
notifyIcon1.ShowBalloonTip(3000, "程式最小化提示",
"圖示已經縮小到托盤,打開視窗請輕按兩下圖示即可。",
ToolTipIcon.Info);
private void MainForm_Move(object sender, EventArgs e)
if (this == null)
return;
//最小化到托盤的時候顯示圖示提示資訊
"圖示已經縮小到托盤,打開視窗請輕按兩下圖示即可。",
ToolTipIcon.Info);
2、隻允許允許一個程式執行個體,即使是通過虛拟桌面方式連接配接過來的,也是隻允許一個人運作。
這個已經封裝好代碼了,隻需要在Main函數裡面調用一下函數即可,允許多個執行個體會出現下面的對話框提示資訊,提示不允許多執行個體運作,如下所示:
代碼如下所示。
/// <summary>
/// 應用程式的主入口點。
[STAThread]
private static void Main()
GlobalMutex();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//******啟動代碼**********
private static Mutex mutex = null;
private static void GlobalMutex()
// 是否第一次建立mutex
bool newMutexCreated = false;
string mutexName = "Global\\" + "WareHouseMis";//系統名稱,Global為全局,表示即使通過通過虛拟桌面連接配接過來,也隻是允許運作一次
mutex = new Mutex(false, mutexName, out newMutexCreated);
catch (Exception ex)
Console.Write(ex.Message);
System.Threading.Thread.Sleep(1000);
Environment.Exit(1);
// 第一次建立mutex
if (newMutexCreated)
Console.WriteLine("程式已啟動");
//todo:此處為要執行的任務
MessageUtil.ShowTips("另一個視窗已在運作,不能重複運作。");
Environment.Exit(1);//退出程式
}
3、使用NotifyWindow給使用者提示資訊
可以通過NotifyWindow類(最後附件中有),做一些資訊的提示,友善使用者了解一些重要資訊的提示,界面較為友好,如下所示:
提示資訊的代碼使用如下:
/// 彈出提示消息視窗
public void Notify(string caption, string content)
Notify(caption, content, 400, 200, 5000);
public void Notify(string caption, string content, int width, int height, int waitTime)
NotifyWindow notifyWindow = new NotifyWindow(caption, content);
notifyWindow.TitleClicked += new System.EventHandler(notifyWindowClick);
notifyWindow.TextClicked += new EventHandler(notifyWindowClick);
notifyWindow.SetDimensions(width, height);
notifyWindow.WaitTime = waitTime;
notifyWindow.Notify();
private void notifyWindowClick(object sender, EventArgs e)
//SystemMessageInfo info = BLLFactory<SystemMessage>.Instance.FindLast();
//if (info != null)
//{
// //FrmEditMessage dlg = new FrmEditMessage();
// //dlg.ID = info.ID;
// //dlg.ShowDialog();
//}
4、使用SearchCondion控件,簡化查詢條件的轉化
不管在Winform或者在WebForm中,查詢構造條件總是非常繁瑣的事情,使用該控件能有效簡化代碼,提高操作的準确及友善行,這個控件我完成了幾年了,一直伴随我處理各種查詢操作。
private string GetConditionSql()
SearchCondition condition = new SearchCondition();
condition.AddCondition("ItemName", this.txtName.Text, SqlOperator.Like)
.AddCondition("ItemBigType", this.txtBigType.Text, SqlOperator.Like)
.AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like)
.AddCondition("Specification", this.cmbSpecNumber.Text, SqlOperator.Like)
.AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like)
.AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like)
.AddCondition("Source", this.txtSource.Text, SqlOperator.Like)
.AddCondition("Note", this.txtNote.Text, SqlOperator.Like)
.AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like)
.AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.LikeStartAt);
string where = condition.BuildConditionSql().Replace("Where", "");
return where;
可以構造條件後,傳入查詢函數,實作資料的查詢。
string where = GetConditionSql();
List<ItemDetailInfo> list = BLLFactory<ItemDetail>.Instance.Find(where, this.winGridViewPager1.PagerInfo);
this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ItemDetailInfo>(list);
this.winGridViewPager1.PrintTitle = Portal.gc.gAppUnit + " -- " + "備件資訊報表";