發表文章

目前顯示的是 7月, 2017的文章

[C#] Windows Form 自訂控制項

圖片
自訂控制項可以大致分成三類 1. 複合控制項   利用原生的控制項組合成一個單元 2. 擴充控制項   繼承原生控制項,對功能做擴充 3. 自訂控制項   基本上就是從頭寫一個新的 這邊談第一類複合控制項的用法: 專案 -> 加入使用者控制項 之後他就是一個class,繼承自UserControl,也會有design的介面可以拉其他控制項進去 建置過後就會出現在原本專案的工具箱中了 參考資料: https://msdn.microsoft.com/zh-tw/library/ms171725(v=vs.110).aspx https://msdn.microsoft.com/library/3sf86w5h(v=vs.110)

Coding字型

圖片
可以使用windows內建的Consolas 或是用 Adobe Source Code Pro 這是 Medium 最新的Release Roman fonts version 2.030 and Italic fonts version 1.050 (OTF, TTF, WOFF, WOFF2, EOT) 預覽的網頁 https://adobe-fonts.github.io/source-code-pro/

[C#] Delegate

委派: 類似C++的fuction pointer,可以將function當作參數傳入其他function 參考資料: https://eric0806.blogspot.tw/2015/01/dotnet-delegate-usage.html 另外,對於剛接觸的人來說,這篇講得蠻清楚的 http://code2study.blogspot.tw/2011/12/c.html 把用法用很簡單的方式呈現出來

[C#] DockPanel Suite

DockPanel Suite 可以讓 Windows Form實現自由移動面板的功能 像Visual Studio或是SQL Server一樣 使用方法: 到官網或是Github上下載專案,自行編譯出dll檔 在要使用的專案中參考此dll (WeifenLuo.WinFormsUI.Docking.dll) 記得還要 using WeifenLuo.WinFormsUI.Docking; 在介面設計區右鍵點選工具箱、選擇項目、Net Framework組件、瀏覽,選取此dll檔 工具箱中就會多出DockPanel的控制項,將它拉到主Form(Form1)上 並將Form1的IsMdiContainer屬性設置為true 新增Form2,把原本繼承的  public partial class Form2 : Form 中繼承的 Form 改成 DockContent 最後在Form1的Load方法中加入 Form2 form2 = new Form2(); form2.Show(this.dockPanel1); form2.Dockto(this.dockPanel1,DockStyle.Left) 就可以在Form1中新增可以自由停靠的Form2了 參考資料: http://www.111cn.net/net/171/93930.htm https://media.readthedocs.org/pdf/dockpanelsuite/latest/dockpanelsuite.pdf

[C#] WinForm動態側邊欄

利用MouseHover、HouseLeave、MouseEnter 等事件實現 首先新增一個checkbox作為控制邊欄顯示的工具 將其Appearence設為Button 並對他設置MouseHover事件,滑鼠移到上面時自動展開邊欄         private void toolStripButton1_MouseHover(object sender, EventArgs e)         {             if (splitContainer1.Panel1Collapsed)//true代表已收合                 splitContainer1.Panel1Collapsed = false;         } 這邊使用SplitContainer是為了可以讓使用者自由調整欄寬 如果用一般的Panel可以直接 panel2.Visable = false 之後是CheckBox_Checked事件,有選取的話則永久顯示邊欄         private void checkBox1_CheckedChanged(object sender, EventArgs e)         {             sidebarshown = !sidebarshown;             if (sidebarshown == false) splitContainer1.Panel1Collapsed = true;             else splitContainer1.Panel1Collapsed = false;         } 之後對邊欄設置MouseLeave事件,離開時如果checkbox沒有按下去的話就自動收合側欄 這邊多判斷了滑鼠位置是希望可以只在滑鼠從右側離開邊欄時才觸發         private void splitContainer1_Panel_MouseLeave(object sender, EventArgs e)         {             if (sidebarshown != true && PointToClient(Cursor.

[C#] 滑鼠位置

比較直覺的取滑鼠位置有 MousePosition 跟 Cursor.Position 兩種方法 效果是一模一樣的 但他們都是抓滑鼠在"螢幕"中的位置 如果想要抓滑鼠在Form中的位子,可以使用 PointToClient(Cursor.Position) 參考資料: https://msdn.microsoft.com/zh-tw/library/system.windows.forms.cursor.position(v=vs.110).aspx https://stackoverflow.com/questions/19164933/cursor-position-relative-to-application

[SQL Server] 不允許儲存變更

不允許儲存變更。您所做的變更需要卸除並重新建立下列的資料表。您已進行至資料表,且無法重新建立或啟用 [防止儲存變更] 選項的變更需要重新建立資料表。 在SQL Server建資料表的時候,可能會遇到這個錯誤訊息,導致無法儲存變更。 會發生這個情況可能是因為: 1. 變更資料行的允許Null設定 2. 重新排序資料行 3. 變更資料行的型別 4. 新增新的資料行 這其實是一個保護資料表被洗掉的機制,在資料庫還沒有資料的時候可以先將其關閉。 設定如下: 若要變更 [ 防止儲存需要重新建立資料表的變更 ] 選項,請依照下列步驟執行︰ 開啟 SQL Server Management Studio (SSMS)。 在 [ 工具 ] 功能表上按一下 [ 選項 ]。 在 [ 選項 ] 視窗的 [瀏覽] 窗格中,按一下 [ 設計工具 ]。 選取或清除 防止儲存需要重新建立資料表的變更 ] 核取方塊,然後按一下 [確定] 。 但在資料庫開始有資料之後,建議還是將這個保護機制打開。 參考資料: https://support.microsoft.com/zh-tw/help/956176/error-message-when-you-try-to-save-a-table-in-sql-server-saving-change

[C#] 多執行緒控制

1. 宣告執行緒 參數放要跑的function Thread ts = new Thread(new ParameterizedThreadStart(TaskShowPanel)); 若function不須傳入參數,則使用ThreadStart() 2. 等待某執行緒跑完 ThreadB.Join(); 3. 暫停執行續 Thread.Sleep(5000);//暫停5秒 4. 前景背景 前景: 直行緒跑完才可以結束 背景: 不管執行緒跑到哪,主執行緒跑完就會直接關閉 5. 避免搶資源 -> Lock 6. volatile 宣告volatile可以告訴編譯器此變數可能被多個執行緒同時修改 參考資料: C# 學習筆記:多執行緒 (2) - 分道揚鑣 [C#] 執行緒 (Thread)(一) https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/volatile

[C#] 對Excel進行讀寫

首先,要先加入 Microsoft Excel 16.0 Object Library 的參考,只要電腦有安裝Excel應該都可以在COM中找到 然後參考 using Excel = Microsoft.Office.Interop.Excel; 呼叫Excel有三個步驟 分別是Application、Workbook、跟Worksheet Application可以透過 Visible與UserControl的屬性控制是否要在前景顯示 剩下的就參考一下以下程式碼吧,這是在revit api中呼叫excel寫入資料的練習 值得注意的是為避免程式執行完之後留下多餘的Excel在後端,需要用try catch finally的方式確保無論程式是否執行成功,都有釋放Excel所占資源 //Output 鋼筋表 //存檔路徑 string savefilename = ""; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "Excel活頁簿(*.xlsx)|*.xlsx|所有檔案(*.*)|*.*"; saveFileDialog1.Title = "Export Rebar Table"; if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) savefilename = saveFileDialog1.FileName; else return Result.Cancelled; //開excel Excel.Application eapp = new Excel.Application();

在Windows Form 上瀏覽 PDF

圖片
在工具箱中按右鍵 -> 新增項目 -> COM元件 選擇Adobe PDF Reader即可 (電腦中需安裝Adobe Reader) AcroPDFLib.dll 與 AxAcroPDFLib.dll 會被自動加入參考檔 之後只要透過axAcroPDF物件的LoadFile function即可在winform中開啟PDF檔案啦 以下為簡單的例子 private void button1_Click(object sender, EventArgs e) { OpenFileDialog open = new OpenFileDialog(); open.Title = "OPEN"; open.Filter = "All Files|*.*"; try { if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK) { axAcroPDF1.LoadFile(open.FileName); } } catch (ArgumentException ex) { MessageBox.Show(ex.Message.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } } 不過如果Adobe Reader是安裝最新的DC版的話,參考進來的Library中似乎不會有LoadFile這個function,要去找舊版的安裝(這次使用v11) 參考資料: https://www.youtube.