2018年2月23日 星期五

動態控制 ContextMenuStrip 不出現

通常在按下滑鼠右鍵要出現選單時,都會用到 ContextMenuStrip 這個控制項,使用方式如下:
1.從工具箱點兩下 ContextMenuStrip,產生 contextMenuStrip1
2.點擊該 contextMenuStrip1,可以編輯清單內容
3.選擇 contextMenuStrip1 要出現在哪個控制項,在該控制項的 ContextMenuStrip 屬性上選擇 contextMenuStrip1 

但是當要動態控制 contextMenuStrip1 要不要出現時,
無法寫成
// 假設 contextMenuStrip1 要出現在 treeView1 的右鍵時
treeView1.ContextMenuStrip = "";
只能在 contextMenuStrip1.Opening 事件上動手腳
boolean bContextMenuStripVisible = false; // 指定是否顯示 ContextMenuStrip
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    if (bContextMenuStripVisible == false)
    {               
          e.Cancel = true;
    }
}

2018年2月22日 星期四

TableLayoutPanel 內的控制項的 Dock 屬性無法完全作用

TableLayoutPanel 是可以讓控制項排列整理的一個控制項(有點繞舌) 因專案需要,在 TableLayoutPanel 內塞了幾種控制項(Label、TextBox、ListBox)

然後把TableLayoutPanel 內的控制項的 Dock 屬性設定為 Fill,塞滿格子

有沒有發現
TextBox 的 Dock 設為 Fill 後,沒完全 Work?
原來是因為 TextBox 的 MultiLine 是 False 的關係,因為只能有一行字,當然無法撐開控制項的高度,所以修改的方式有兩種,視需求選擇使用
1. 改變字型大小
2. 把 MultiLine 設為 True

ListBox 的 Dock 設為 Fill 後,沒完全 Work?
原來 ListBox 有一個屬性 IntegralHeight(表示清單是否可以只包含完整的項目),意思應該是指 ListBox 的高度不足以顯示完整的 Item 時,只會展開到完整顯示的 Item 的高度,所以只要將 IntegralHeight 設為 False,就可以達到 Dock=Fill 的完整效果了

如果要將控制項完全貼合 TableLayoutPanel,則調整內部的各控制項的 Margin 屬性即可

2018年2月9日 星期五

NChar 與 Char 的差別

簡言之

NChar 是以位元組(2個位元)的方式儲存資料(NVarChar 亦同)
Char 是以位元的方式儲存資料(VarChar 亦同)

說明:
位元組:可以儲存半型字 或 全型字
位元:僅可以儲存半型字

有點雙人床與單人床的概念
雙人床:可以睡 1 個人或是 2 個人
單人床:僅可以睡 1 個人

所以當你要存的資料
只包含 英文、數字,即半型字,可以用 Char 即可
只包含 中文,即全型字,也可以用 Char 但記得長度要開 2 倍,或是直接用 NChar,長度就不用開到 2 倍

舉例:
以下語法會出現 字串或二進位資料會被截斷 的訊息
因為資料"五"是一個全型字,而欄位Char(1)僅能存一個半型字
declare @MyTable Table (ColName Char(1))
insert into @MyTable Values ('五')
改用 NChar
-- 改用 NChar
declare @MyTable Table (ColName NChar(1))
insert into @MyTable Values ('五')
或是改成 2 倍長度
--改成 2 倍長度 Char(2)
declare @MyTable Table (ColName Char(2))
insert into @MyTable Values ('五')
就OK了

若是 中文、英文、數字夾雜,那就看個人喜愛了



另外提供兩個SQL函數(Len、DataLength),可以幫助釐清上面的差別
將語法改成如下:
將欄位長度改成 3
-- 在 Char 的情況下
declare @MyTable Table (ColName Char(3))
insert into @MyTable Values ('五')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 1,即資料的字元數
-- DATALENGTH(ColName) = 3,即欄位的位元數
-- 在 NChar 的情況下
declare @MyTable Table (ColName NChar(3))
insert into @MyTable Values ('五')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 1,即資料的字元數
-- DATALENGTH(ColName) = 6,即欄位的位元數

再來,將資料內容修改一下(儲存一個全型字和一個半型字)
-- 在 Char 的情況下
declare @MyTable Table (ColName Char(3))
insert into @MyTable Values ('五5')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 2,即資料的字元數
-- DATALENGTH(ColName) = 3,即欄位的位元數
-- 在 NChar 的情況下
declare @MyTable Table (ColName NChar(3))
insert into @MyTable Values ('五5')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 2,即資料的字元數
-- DATALENGTH(ColName) = 6,即欄位的位元數