星期四, 7月 31, 2014

[C#] 動態產生內含 6 個 CheckBox 的 Panel

論壇問題,把這問題需求整理為
根據使用者輸入數字,動態產生內含 6 個 CheckBox 的 Panel,並需要利用 Text File 記錄使用者勾選選項
[C#] 動態產生內含 6 個 CheckBox 的 Panel
namespace DynamicAddCheckBoxs
{
    class CheckBoxInfo
    {
        public string plName { get; set; }
        public string cbName { get; set; }

        public CheckBoxInfo(string _plName , string _cbName)
        {
            this.plName = _plName;
            this.cbName = _cbName;
        }
    }
}

星期三, 7月 30, 2014

[C#] 只允許 Textbox 輸入數字

MVA Twenty C# Questions Explained - [16 How do I make a text box that only accepts numbers?]

直接用 NumericUpDown 控制項來用也是一種方法,不用再花心思去寫 Code,先筆記下來

MVA 範例:在 TextBox KeyPress 中去偵測鍵盤操作

private void txtNumeric_KeyPress(object sender, KeyPressEventArgs e)
{
    // e.Handled MSDN 說明:
    // 若只是在表單層級處理鍵盤事件,而且不讓其他的控制項接收鍵盤事件,
  // 請將表單的 KeyPress 事件處理方法中的 KeyPressEventArgs.Handled 屬性設為 true。
    e.Handled = !char.IsDigit(e.KeyChar); //&& !char.IsControl(e.KeyChar);
}

星期一, 7月 28, 2014

[VS] 大綱

Visual Studio 的大綱功能時,可以展開或摺疊程式碼區塊,方便閱讀 Code
  • 建立一個 Method,VS 會自動建立大綱
當 Code 變成區塊,會在後方出現一個 ... 方塊,滑鼠滑到該 ... 方塊上,可以預覽 Code

[VS] 大綱
  • 在一個 Method 內,把一段 Code 變成區塊
把要變成區塊的 Code 全選起來,滑鼠右鍵點選 "範圍陳述式" 或利用快捷建 Ctrl + K , S

[VS] 大綱-2

選擇 #region 就是程式碼區塊,並輸入程式碼區塊說明

[VS] 大綱-3

下圖為套用程式碼區塊後,展開和折疊的畫面,折疊情況下,點選程式碼區塊說明也可以預覽區塊內的 Code

[VS] 大綱-4

星期五, 7月 25, 2014

[C#] 根據 CheckBox 來顯示 DataGridView 欄位 2

這篇 [C#] 根據 CheckBox 來顯示 DataGridView 欄位 的延伸,原 PO 是根據 DataGridView 欄位數,動態在另外一個 Form 內產生 CheckBox,來讓使用者勾選是否顯示欄位,之前想的太簡單了

建立 ColumnState Class 來當成傳遞參數
namespace CheckBox2ShowColumn2
{
    public class ColumnState
    {
        public string ColName{get;set;}
        public Boolean ColVisible{get;set;}
    }
}

星期三, 7月 23, 2014

[C#] abstract 和 virtual 函數的差異

MVA Twenty C# Questions Explained - [09 ​What is the difference between abstract and virtual functions?]

整理影片中說明重點
  • abstract method 不會有程式內容
namespace MVATwentyQuestions
{
    abstract class absClass
    {
        public abstract void DisplayValue(string value)
        {
            // DoSomething
        }
    }
}
[C#] abstract 和 virtual 函數的差異-1

星期二, 7月 22, 2014

[C#] 根據 CheckBox 來顯示 DataGridView 欄位

論壇問題:使用者要根據 CheckBox 的 TabIndex 來控制 DataGridView 欄位是否顯示

下圖為控件 TabIndex 的顯示圖,請 CheckBox 依序從 1 排到 5

[C#] 根據 CheckBox 來顯示 DataGridView 欄位-1

星期一, 7月 21, 2014

[VS] 檔案名稱中的星號

從下圖中可以看見檔案 Tab 中的檔案名稱,名稱後面有一個星號(圖中的紅框),此星號代表該檔案有經過編輯,但目前未儲存,一旦儲存後,星號就會消失 ~~

[VS] 檔案名稱中的星號

星期五, 7月 18, 2014

[Word] 表格內的加總國字金額

今天被問到,Word 表格內的金額加總,可不可以用國字金額來表示,試了一下發現,Word 上似乎沒有現成功能,讓使用者按一按就可以達成這個目的

先建立一個建議 Table 和資料來測試一下
  1. 滑鼠指標放在要設計為加總的資料欄位上
  2. 表格工具內的板面配置 Tab
  3. 點選公式功能
[Office] Word 表格的加總國字金額-1

Word 本身提供的功能在數字格式內並沒有轉成國字金額的選項,都是數字金額的格式

[Office] Word 表格的加總國字金額-3

利用錄製巨集去觀察"Word 數字功能",是如何把數字金額變成國字,發現是下 "\* CHINESENUM2" 來轉國字金額,在公式內的後方下此參數,果然就可以做到啦

[Office] Word 表格的加總國字金額-2

當再次進入公式畫面,並不會顯示該參數存在,如下圖

[Office] Word 表格的加總國字金額-4

該方法仍然無法避免 Word 內轉國字金額有一百萬限制,建議利用 Excel 搭配 Word,利用連接表格功能複製表格到 Word 內呈現,不但可以避開一百萬限制,萬一項目金額有所變化,在 Excel 內修改,加總會自動變化且反應到 Word 表格內,會是一個比較有效率的做法 ~~

Office 版本為 2013

星期四, 7月 17, 2014

[C#] 關閉全部的 Form

論壇問題,原本問題是要根據輸入的數值來決定關閉多少已開啟的 Form,換句話說來練習一下,關閉全部已開啟的 Form

OpenForms 作法
namespace CloseAllForm
{
    public partial class OpenForms : Form
    {
        public OpenForms()
        {
            InitializeComponent();
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {

                FormShow demo = new FormShow();

                int x = 10 * i;
                int y = 20 * i;
                demo.Location = new Point(x, y);

                string FormInfo = string.Format("Form{0}", i);
                demo.Text = FormInfo;
                demo.Name = FormInfo;

                demo.Show();
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            List<Form> FormClose = Application.OpenForms.OfType<Form>().ToList();
            foreach (Form item in FormClose)
            {
                if (Form.ActiveForm == item) continue;
                item.Close();
            }
        }
    }
}

星期三, 7月 16, 2014

[C#] decimal 輸出兩位小數

Twenty C# Questions Explained -[17 How do I round a decimal value to two places for output? ]

藉由對 decimal 進行格式化來取得小數兩位
  • 範例說明
static void Main(string[] args)
{
   decimal value = 45432456.2490850M;
   // 原始數值
   Console.WriteLine(value);

   // 自訂數值格式字串
   Console.WriteLine(value.ToString("#.##"));
   Console.WriteLine(String.Format("{0:0.00}", value));
   // 標準數值格式字串
   Console.WriteLine(value.ToString("n2"));
   Console.WriteLine("{0:c}", value);
   // 自己加上
   Console.WriteLine(value.ToString("f2"));
}

[C#] decimal 輸出兩位小數

星期三, 7月 09, 2014

[C#] ref 和 out 差異

MVA Twenty C# Questions Explained - [​10 What is the difference between ref and out keywords?]

影片內容說明兩者最大差異在於 ref 參數必須先初始化,而 out 參數不需要

[C#] ref 和 out 差異-2

MVA 範例:說明 ref 和 out 都是 ByRef
static void Main(string[] args)
{
    string outString = "This is the original outString";
    Console.WriteLine(outString);
    outMethod(out outString);
    Console.WriteLine(outString);

    string refString = "This is the original ref string";
    Console.WriteLine(refString);
    refMethod(ref refString);
    Console.WriteLine(refString);
}

static void outMethod(out string outString)
{
    outString = "This is the new outString value";
}

static void refMethod(ref string refString)
{
    refString = "This is the new refString value";
}
[C#] ref 和 out 差異

星期五, 7月 04, 2014

[C#] 根據 Dictionary 的 value 來進行排序

MVA Twenty C# Questions Explained - [​19 How do I sort a dictionary by value?]
  • LINQ
static void Main(string[] args)
{
    Dictionary<string, int?> dic = new Dictionary<string, int?>();
    dic.Add("Two", 2);
    dic.Add("Zero", 0);
    dic.Add("Five", null);
    dic.Add("Three", 3);
    dic.Add("One", 1);
    dic.Add("Four", 4);

    Dictionary<string, int?> result = dic.OrderBy(Data => Data.Value).ToDictionary(keyvalue => keyvalue.Key, keyvalue => keyvalue.Value);

    foreach (KeyValuePair<string,int?> kvp in result)
    {
        Console.WriteLine(string.Format("Key - Value:{0} - {1}", kvp.Key, kvp.Value));
    }
}
[C#] 根據 Dictionary 的 value 來進行排序-1

星期三, 7月 02, 2014

[C#] 利用方向鍵移動 TextBox Focus

論壇問題
版面上有 100 個 textbox,編號為 1-100,textbox 排列為 1 欄 20 個,共 5 欄,當一開打這個 form 會將在第一欄第一列第一個 textbox 的背景顏色變更為黃色,然後可以透過鍵盤的 上、下、左、右來選取 textbox,當被選到的 textbox 背景顏色會為"黃色",沒有選到的會為灰色(預設)

拉 100 個 TextBox 實在是太瘋狂了,只利用 10 個 TextBox、5 欄來練習
public partial class frmTextBoxFcous : Form
{
    public frmTextBoxFcous()
    {
        InitializeComponent();
    }

    private void TextBoxFcous_Load(object sender, EventArgs e)
    {
        colorcontrol();
    }

    // override ProcessCmdKey 來進行鍵盤偵測
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // 偵測方向鍵:上、下、左、右
        if (keyData == Keys.Left || keyData == Keys.Right || keyData == Keys.Up || keyData == Keys.Down)
        {
            // 利用上、下、左、右來判斷,
            // 上 -1
            // 下 +1
            // 左 -2
            // 右 +2
            int count = 0;
            switch (keyData)
            {
                case Keys.Up:
                    count--;
                    break;
                case Keys.Down:
                    count++;
                    break;
                case Keys.Left:
                    count -= 2;
                    break;
                case Keys.Right:
                    count += 2;
                    break;
            }

            // 利用 ActiveControl 來判斷 Focus 現在在哪個控件上
            string ActiveControlName = this.ActiveControl.Name;
            // Form 上的 TextBox 控件名稱,故意用 TextBox1 - TextBox10 來命名,用名稱來控制 Focus 應該往哪跳
            int ActiveControlLength = ActiveControlName.Length;
            string NextControlName = "TextBox" + (Convert.ToInt16(ActiveControlName.Substring(7, ActiveControlLength - 7)) + count).ToString();

            // 確認 TextBox 是否真的存在
            Control[] ctls = this.Controls.Find(NextControlName, false);
            if (ctls.Length != 0) this.Controls[NextControlName].Focus();
        }

        colorcontrol();
        return base.ProcessCmdKey(ref msg, keyData);
    }

    private void colorcontrol()
    {
        // 不管三七二十一,先把全部的 TextBox 背景變成灰色
        // 此語法只針對 TextBox 去掃
        foreach (TextBox txt in this.Controls.OfType<textbox>())
        {
            txt.BackColor = Color.Gray;
        }

        // Form 一開始執行時就必須變色,此時無法偵測 ActiveControl,
        // 此情況顯示 TextBox1,同時也把 TextBox1 的 Tab Order 設為 0
        if (this.ActiveControl == null)
        {
            textBox1.BackColor = Color.Yellow;
        }
        else
        {
            this.ActiveControl.BackColor = Color.Yellow;
        }
    }
}
[C#] 利用方向鍵移動 TextBox Fcous

星期二, 7月 01, 2014

[VFP] 註冊 MSCOMCTL.OCX

公司 VFP ERP 內的樹狀圖是依賴 MSCOMCTL.OCX 這個元件來產生,因此新電腦需要把它安裝上去,印象中只要把該元件丟進 system32 資料夾內就可以 run,但還是會遇上必須要手動對元件進興註冊的情況
  • 在 VFP 中使用該元件,但沒有註冊的錯誤訊息
[VFP] 註冊 MSCOMCTL.OCX-1
Step1:根據 OS 位元把該元件放在下面位置:
  • 32 位元:C:\Windows\System32
  • 64 位元:C:\Windows\SysWOW64
step2:用系統管理員打開命令提示字元,避免權限不足無法進行註冊

[VFP] 註冊 MSCOMCTL.OCX-3

step3:輸入註冊命令
  • 32 位元:Regsvr32 C:\Windows\System32\MSCOMCTL.OCX
  • 64 位元:Regsvr32 C:\Windows\SysWOW64\MSCOMCTL.OCX
[VFP] 註冊 MSCOMCTL.OCX-4

  • 註冊成功訊息
[VFP] 註冊 MSCOMCTL.OCX-2