[ C# ] 物件序列化與反序列化

在寫論文系統時,對於字卡需要有儲存的讀取的功能

所以在結構上,字卡就不單單只能是控制項的型態

為能達到讀存的效果,我的作法跟想法就是把字卡結構化

再利用序列化反序列化的方式作讀存。

以下就筆記一下序列化和反序列化的作法:

================================================

[ 序列化 ]

 

序列化的對象可為 class、struct、enum 和 delegate
而序列化對象的內容均要是可序列化才行
由於論文系統是以 class 為物件,這邊就已 class 作為舉例

圖片

如上圖,在要序列化的 class 上加上 [Serializable] 讓此物件為可序列化目標
將物件設定為可序列化目標後,即可將物件以序列化的方式作存檔
以下圖為例:

1. 先開啟串流 (FileStream) 建立檔案

2. 宣告一個二進為序列化 Formatter

3. 使用方法 Serialize 將序列化目標指定至檔案作寫入存檔

( 圖中 CardMainList 為 List<T> 型態的序列化目標 )

圖片

 

[ 反序列化 ]

 

顧名思義,將序列化目標所存的檔案,透過反序列化的方式
轉換回其序列化目標,上面例子中,序列化的目標為 CardMainList
則我們反序列化後的物件格是即為 CardMainList。
如下圖為讀檔後反序列化的步驟:

1. 開啟串流 ( FileStream ) 讀檔

2. 宣告一個二進為序列化 Formatter

3. 反序列化讀入的串流,並回存給相對應格式的目標( 物件 )

圖片

以上,一個簡單的二進位序列化讀存功能就完成了。

Done!

p.s. 附上參考資料,以及感謝黃大師教導如何使用序列化。

[ C# ] 屬性欄( PropertyGrid ) 快速上手(二)

此篇筆記在實作系統時,自訂義屬性欄資訊的方法。

簡單來說,要讓屬性欄顯示瀏覽資訊是透過設定 SelectedObject 來指定瀏覽類別,

所以如果僅想顯示部分屬性的話,則可以先建立一個類別( class ),定義此類別中的

資料,再透過 SelectedObject 來指定建立的類別( class )即可。

=======================================================

[ 步驟一 ] 建立一個類別( class )

111

[Category(“")] – 需先 using 命名空間 System.ComponentModel

此為定義屬性欄顯示時的「分類」。

此範例僅建立姓名屬性供瀏覽,也可在此類別中新增其他想顯示的資訊,

如 Size、Font 或 Location等,以下示範新增 Location 的範例。

111

Location 屬於 Point 型別,故新增時以 Point 宣告定義即可。

( 使用 Point 時需先 using 命名空間 System.Drawing )

 

[ 步驟二 ] 使 PropertyGrid 的 SelectedObject 指定為自訂義類別即可

111

=======================================================

由上述步驟及示範,即可達到自訂義屬性欄的效果。

Done!

 

此筆記參考以下資訊:

 PropertyGrid 應用心得自訂控制項的顯示視窗屬性(一)自訂控制項的顯示視窗屬性(二)

[ C# ] 屬性欄( PropertyGrid ) 快速上手

在製作論文系統時,字卡編輯模式下想實現點擊字卡後,會出現字卡

的名稱、大小、位置及圖片內容,原本想以 ListView 來實作,但發現

其效果不是系統想要的,偶然的情況下發現 PropertyGrid 剛好可以滿

足字卡編輯模式的需求。

=======================================================

[ 步驟一 ] 在所有工具裡找到 PropertyGrid ( VS2010 )

圖片

[ 步驟二 ] 將要顯示屬性的元件或控制項指定給此屬性欄即可

圖片

 

=======================================================

以上是簡單的屬性欄( PropertyGrid )使用,下篇介紹如何自訂義屬性欄

中欲顯示的資料。

Done!

 

屬性欄應用參考資料

[ C# ] WinForm 中如何實現「拖曳元件」

作論文轉播字卡系統時,「字卡編輯器」的功能中需要用到拖曳元件的效果,

關於拖曳元件的概念,可分為三部份 MouseDownMouseMoveMouseUp

對於該元件或控制項實作這三樣事件,即可達到拖曳元件的效果!

=======================================================

在作拖曳元件時,可先定義一些全域變數幫助拖曳時計算元件位置。

圖片

[ MouseDown ]

圖片

[ MouseMove ]

圖片

[ MouseUp ]

圖片

=======================================================

以上例子是以 PictureBox 為例的程式碼截圖,當然也可換成 Control 來符合更多控制

項種類,另外,在實作拖曳實若控制項或元件有閃爍的情況,可藉由 DoubleBuffer 來

減緩此種現象,DoubleBuffer 為雙重緩衝繪製的機制,最簡單的方法就是在該 Form

的屬性中,將DoubleBuffered 改選為 True 即可。

圖片

 

Done!

 

附上該方法參考網址

[ C# ] WinForm 顯示於延伸螢幕之方法

在作論文「賽事字卡轉播系統」時,需將字卡畫面顯示於主播機 ( 延伸螢幕 ),

並且讓此 WinForm 全螢幕播放,以下找到幾個方法能達到這樣的目的。
—————————————————————————————————-
[ 方法一 ] 利用 Screen.PrimaryScreen.Bounds.Width 找到主要螢幕的寬度,
並將欲放置延伸螢幕的 Form 的 DesktopLocation 設置為其寬度,
這樣就可強迫此 Form 開啟位置為延伸螢幕。

[ 方法二 ] 對所有螢幕作判斷,判斷是否為主要螢幕,若有螢幕不是主要螢幕
則將此 Form 開啟位置設定為此螢幕的 Location,即可。

圖片

 

此為方法一參考資料

DONE!!

[ .NET ] SQL CE reset ID 為初始值

在資料庫中若僅是刪除 ( Delete ) 資料或是清空資料的話,則下次加進來的資料

其自動產生的 ID ( 或是 IDENTITY ) 仍會以最後產生之 ID 為基準向下遞增;在測

試完資料庫後,若想將 ID reset ,一般資料庫 ( SQL ) 可使用以下指令:

       TRUNCATE TABLE '資料表名稱'

但在 SQL Server CE 中,發現無法使用此語法來達到初始化的效果,在谷歌後

發現這個問題並不難解,這篇討論中可以得知,使用以下指令:

     ALTER TABLE '資料表名稱' ALTER COLUMN ID IDENTITY (1,1)

即可將資料表清空且 ID 初始化。

DONE!

[ .NET ] ASP.NET C# 無法使用 SqlCeConnection 之問題解決

上一篇成功建立了 SqlCe 的資料庫檔案 (.sdf) ,接著是在程式中對資料庫的操作。

在 C# 中要對 SQL Server Compact Edition 進行連線,則需使用 SqlCeConnection

,在這邊參考黃大師的數字筆記,很明確地指出,若要使用 SqlCeConnection,

則需最額外參考的加入。

圖片

圖片

加入參考後,即可 using 。圖片

———————————————————————————————————————

接著再參考一次黃大師的數字筆記之二

在 ASP.NET 使用 SqlCeConnection 時會發生例外 (並非設計供 ASP.NET使用)

解決方法如下:

在使用 SqlCeConnection 前加上
AppDomain.CurrentDomain.SetData(“SQLServerCompactEditionUnderWebHosting", true);
黃大師數字筆記中提到,建議將此行放在 Global.asax 的 Application_Start 中,讓此行僅執行一次即可。

DONE!

[ .NET ] 於 ASP.NET C# 中使用 SQL Sever Compact

製作UU網頁時,在背後需要一個資料庫,在同學的建議之下,使用 SqlCe 來製作,

而使用 SQL Server Compact 產生資料庫 (.sdf) 在網頁專案中並無法直接使用。

原因可由此篇文章中得知:「微軟官方認為 SQLCE 本就不是開發在多人環境下使用,

所以才無法在 WEB 這種多人專案上直接新增出 SQLCE 檔。」

——————————————————————————————————————

[ 解決方法 ]

  1. 建立 Windows Form 專案,再由此新增一個 SQLCE 檔案。
    圖片
  2. 接著於模型(.edmx)中繪製資料表間關聯性。圖片
  3. 繪製完成後,按右鍵選擇「由模型產生資料庫」,選擇欲連線資料庫後完成。
    圖片
  4. 按完成後,會產生 .sqlce 檔,雙擊此檔案會看到語法頁,
    於此頁按右鍵選擇「執行SQL」,在資料庫檔案中選取資料庫路徑即可。
    圖片圖片
  5. 完成連接後,此 Database.sdf 即可使用。
    ( 若於 WEB 專案中欲使用 .sdf 的話,在伺服器總管中「加入資料連接」
    選擇「Microsoft SQL Server Compact 3.5(or 4.0)」,接著設定剛剛產
    生的 .sdf 檔即可。)
    圖片圖片
    圖片
  6. 打完收工,DONE!

[ C# ] 資料庫程式連接方式

今天在撰寫程式與資料庫溝通時找到一篇整理的很好的文章

以下筆記了幾種資料庫 (Access, SQL, MySQL) 的連結方式:

  1. 連接 Accessusing System.Data.OleDb;

    String strCon =
              “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 檔案名稱 + “.mdb;" ;
    OleDbConnection AccessCon = new OleDbConnection(strCon);
    AccessCon.Open() ;           // 開啟資料庫連接

    AccessCon.Close() ;          // 關閉對資料庫連接

  2. 連接 Excel

    using System.Data.OleDb;

    String strCon =
              “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 檔案名稱 +
    “.xls;ExtendedProperties=Excel 8.0;" ;

    OleDbConnection ExcelCon = new OleDbConnection(strCon);
    ExcelCon.Open();

    ExcelCon.Dispose();                // 釋放 Component 所使用的資源

  3. 連接 SQL Severusing System.Data.SqlClient;

    // 用 Windows 身份驗證
    String strCon =
              “Data Source=(local);Initial Catalog=TestDb;Integrated Security=SSPI;" ;

    // 用 SQL Server 身份驗證
    String strCon =
    @“Data Source=.\SQLExpress;Database=TestDb;Uid=user;Pwd=****;" ;

    SqlConnection SqlSvrCon = new SqlConnection(strCon);
    SqlSvrCon.Open();

    SqlSvrCon.Close();

  4. 連接 MySQL
    要連接 MySQL 前需先加入參考 ( Mysql.Data.dll )
    using MySql.Data.MySqlClient;MySqlConnection my_DB_Connection;
    string myConnection_DB_String;

    myConnection_DB_String = String.Format(
           “server={0};user id={1}; password={2}; database={3}; pooling=false",
           “127.0.0.1″, “root", “xxxx", “testDB"); // 連結mdb之字串
    my_DB_Connection = new MySqlConnection(myConnection_DB_String);
    my_DB_Connection.Open();

    my_DB_Connection.Close();

  • p.s. 綠字部分為自行修改的檔案名稱、使用者帳號或密碼。

參考文章:隨便寫寫的新天地

[ C# Form ] 跨執行緒存取UI

在撰寫 Windows Form 時,當使用多個執行緒 (Thread),

若需在不同執行緒下控制元件,會遇到「跨執行緒控制無效…」的問題。

目前參考網路上的解法有二:

  1. 直接對 Form 的屬性作改變,此法較不安全,若程式很單純不複雜,以此解即可:
    Form.CheckForIllegalCrossThreadCalls = False
  2. 採委派的方式,此法較為正統,但撰寫上較為複雜:
      private delegate void UpdateUICallBack(string value, Control ctl);  
      private void UpdateUI(string value, Control ctl)  
      {  
          if (this.InvokeRequired) {  
              UpdateUICallBack uu = new UpdateUICallBack(UpdateUI);  
              this.Invoke(uu , value, ctl);  
          }  
          else {  
              ctl.Text = value;  
          }  
      }
    在需要存取控制項時作 UpdateUI 即可。

參考文章 : mOMo’s BLOG