星期三, 5月 31, 2017

[Win] 無法建立陰影複製

發現 Server 事件檢視器上有錯誤訊息
VssAdmin: 無法建立陰影複製: 找不到指定的磁碟區或是它並不是本機磁碟區。 命令列: 'C:\Windows\system32\vssadmin.exe Create Shadow /AutoRetry=15 /For=\\?\Volume{6c808f0d-465a-11e2-851c-5cf3fc2c0730}\'。

在命令提示字元內,利用  mountvol 語法來檢查 Server 上目前的 Volume

這篇官方文章 Windows Server 2003 中移除磁碟區後,您會收到 「 無法建立陰影複製 」 錯誤 中說得很清楚

若要避免這個問題,請移除磁碟區之前關閉 「 共用資料夾陰影複製 」 功能。如果要解決這個問題如果已經發生,請依照下列步驟執行︰
  1. 關閉共用資料夾陰影複製功能。
  2. 開啟工作排程器,並移除任何剩餘的陰影複製工作。陰影複製工作會出現類似於"VSSVolumeGUID"或"ShadowCopyVolumeVolumeGUID"。
    • 注意排定工作的名稱是與排定的工作相關聯的磁碟區陰影複製服務工作的資源名稱相同。
  3. 開啟共用資料夾陰影複製功能。
在排程中可以看見失敗的陰影備份排程,移除後就解決

星期一, 5月 22, 2017

[Win10] 大易輸入法

幫某單位更換 PC 時,突然被問到要如何在 Win10 上加入大易輸入法,當場當機找不到去哪裡設定,Orz

控制台 => 時鐘、語言和區域 => 語言

[Win10] 大易輸入法-1

語言 => 輸入法 => 新增輸入法

[Win10] 大易輸入法-2

選項內就可以看見大易輸入法啦

[Win10] 大易輸入法-3

筆記一下

星期五, 5月 19, 2017

[git] git stash 衝突

有個小需求插單,直接下 git stash -u 暫存後,就在該 branch 上趕快完成插單需求,完成後下 git stash pop 把暫存叫回來,然後該 Project 就無法載入,Orz

[VSTS] git stash 衝突-20


星期三, 5月 17, 2017

[Skype] 找不到 MSVCP140.dll 檔案

在商用 PC 上不透過還原光碟,直接用 MS Win10 安裝檔案灌系統,Skype V7.36安裝完後,會出現下面的錯誤訊息

[Skype] 找不到 MSVCP140.dll 檔案-1

[Skype] 找不到 MSVCP140.dll 檔案-2

了解後,發現是沒有安裝 Visual C++ 2015,下載並安裝 32bit 版本,Skype V7.36 就可以正常執行,用還原光碟是一堆有的沒有的,用原廠檔案安裝是甚麼都沒有,XD

星期三, 5月 10, 2017

[C#] DataGridView - 指定欄位進行排序

這篇 MSDN 文章 - 如何:自訂 Windows Form DataGridView 控制項的排序 的第一個範例:程式設計排序,基本上是把 DataGridViewColumn.SortMode = DataGridViewColumnSortMode.Automatic 自動排序,變成寫 Code 指定排序,範例是把排序功能寫在 BtnSort 內執行,故意把 Code 寫在 DataGridView.ColumnHeaderMouseClick Event 上,操作上會比較直覺

MSDN 說明
使用的資料行 SortMode 屬性設定為 DataGridViewColumnSortMode.Automatic, 、 SortedColumn 和 SortOrder 屬性會自動設定,並顯示適當的排序圖像。 使用的資料行 SortMode 屬性設定為 DataGridViewColumnSortMode.Programmatic, ,您必須顯示排序圖像自行透過 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性。

星期四, 5月 04, 2017

[C#] DataGridView 控件屬性設定

延續這篇 [C#] DataGridView.ReadOnly,DataGridView.ReadOnly 從 true 變成 false 之後,全部的 DataGridViewColumn.ReadOnly 都會變成 false,那 Form 一執行時就要記錄 DataGridViewColumn.ReadOnly 的設定,這樣就可以還原 ReadOnly 狀態,沒想到事情沒這麼單純

拉一個 DataGridView 並手動產生兩個 DataGridViewTextBoxColumn,基本上 Layout 只是觀察 Designer.cs 用,沒甚麼作用
理論上 WinForm 啟動時,加入 DataGridViewTextBoxColumn 時會觸發 DataGridView.ColumnAdded 事件,所以只要在 ColumnAdded 內紀錄下來就行,想像如下面的 Code
namespace dgvDesigner
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        StringBuilder sb = new StringBuilder();
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.ColumnAdded += DataGridView1_ColumnAdded;
            sb.Clear();
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Col1", ReadOnly = false });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "Col2", ReadOnly = true });
            MessageBox.Show(sb.ToString(),"執行階段新增 DataGridVeiwTextboxColumn");
        }

        private void DataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
        {
            sb.AppendLine($"Name:{e.Column.Name} - ReadOnly:{e.Column.ReadOnly}");
        }
   }
}
但事情總是沒有這麼美好,自訂的 DataGridView 控件,一直沒有辦法記錄到 DataGridViewColumn.ReadOnly,利用中斷點才發現,為什麼是 DataGridViewTextColumn 加進 DataGridView.Columns 後才設定 DataGridViewTextColumn 的相關屬性設定,ColumnsAdded 完全派不上用場,Orz
嘗試把 DataGridViewColumn 屬性設定,手動搬移到 DataGridView.Columns.AddRange() 前,Columns.Added 就抓的到 ReadOnly,不過當在設計階段有動到 DataGridViewColumn 設定值,又回復到上圖的順序,而且 Designer.cs 還是不要去亂動比較好,>.<

以前看 Designer.cs 都沒有特別感覺,這次剛好注意到這個點,記錄一下

星期三, 5月 03, 2017

[C#] DataGridView.ReadOnly

透過在設計階段和執行階段變更 DataGridView.ReadOnly 來觀察 DataGridViewColumn.ReadOnly 變化情況

WinForm Layout
  • DataGridView 並新增兩個 DataGridViewTextBoxColumn
    • DataGridView.ReadOnly = false,新增控件 ReadOnly 預設值
    • DataGridViewColumn1.ReadOnly = false,新增控件 ReadOnly 預設值
    • DataGridViewColumn2.ReadOnly = true,新增控件後,故意把 ReadOnly 設為 true
    • 以上三個 ReadOnly 在文章內容中,統稱預設值
  • 兩個 Button
namespace dgvReadOnly
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        StringBuilder sb = new StringBuilder();
        private void button1_Click(object sender, EventArgs e)
        {
            sb.Clear();
            sb.AppendLine($"DataGridView.ReadOnly:{dataGridView1.ReadOnly}");
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                sb.AppendLine($"DataGridViewColumn.ReadOnly:{col.ReadOnly}");
            }
            MessageBox.Show(sb.ToString());
        }

        bool ReadOnly = true;
        private void button2_Click(object sender, EventArgs e)
        {
            dataGridView1.ReadOnly = ReadOnly;
            ReadOnly = !ReadOnly;
        }
    }
}

執行階段:
  • 圖一:在設計階段建立好的預設值
  • 圖二:透過 Button 變更 DataGridView.ReadOnly = true 後,發現 DataGridViewColumn.ReadOnly 也會全部一起改變為 true
  • 圖三:再次把 DataGridView.ReadOnly = false 之後,發現圖一設計階段 DataGridViewColumn.ReadOnly 預設值已經回不來啦

設計階段才是想記錄的重點,因為很混亂,Orz

把 DataGridView.ReadOnly 設為 true 後,並不會像執行階段一樣,把 DataGridViewColumn.ReadOnly 也設為 true


DataGridViewColumn1.ReadOnly 仍維持 false 狀態


DataGridViewColumn2.ReadOnly 竟然變成 false


觀察 Designer.cs 的 ReadOnly 狀態
  • DataGridView.ReadOnly = true
  • DataGridViewColumn1.ReadOnly = false
  • DataGridViewColumn2.ReadOnly = true
DataGridView.ReadOnly 變更後,DataGridViewColumn.ReadOnly 和 Designer.cs,在設計階段彼此之間對應不起來,Orz

結論:就不要管設計階段 DataGridViewColumn.ReadOnly 設定值是甚麼,一律以 DataGridView.ReadOnly 在執行階段設定值為主,並注意一下從 ReadOnly = true 變成 false,DataGridViewColumn.ReadOnly 就通通為 false,並不會是設計階段的預設值喔

星期二, 5月 02, 2017

[C#] DataGridView 子控制項

想要弄一個自訂的 DataGridView 控制項來用,才發現 DataGridView 內好像有未知的子控制項,寫了段 Code 來掃 DataGridView 內全部的子控制項

Layout 就很簡單的拉了一個 DataGridView 和 Button 在畫面上而已
namespace dgvChild
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void GetDataGridViewChildControl(Control Ctls)
        {
            foreach (Control Ctl in Ctls.Controls)
            {
                sb.AppendLine($"Type:{Ctl.GetType()} - Name:{Ctl.Name}");

                if (Ctl.HasChildren)
                    GetDataGridViewChildControl(Ctl);
            }
        }

        StringBuilder sb = new StringBuilder();
        private void button1_Click(object sender, EventArgs e)
        {
            sb.Clear();
            GetDataGridViewChildControl(dataGridView1);
            MessageBox.Show(sb.ToString());
        }
    }
}
原是抓控件名稱來顯示,一直都是空白 (Empty),所以也搞不清楚到底是甚麼控件,後來改成抓控件 Type 才發現是 HScrollBar 和 VScrollBar

[C#] DataGridView 子控制項

星期一, 5月 01, 2017

商用 PC 移除 Office365

公司最近買的新商用 PC,要安裝設定時,一整個傻眼,為什麼 Office 365 要安裝多國版本,總共 15 個,Orz

ASUS 商用 PC - D620MT-1

要把 Office 365 一個一個移除時,才發現每個不同語言版本的移除畫面,也是該語言說明,只好先打開繁體來移除看看,成功移除後陸續移除其他語言版本,就在某語言移除過程中,竟然失敗,還好這時候,英文版本還在,利用移除英文版本來看看錯誤訊息,很遺憾,只有文字看得懂,沒有任何幫助,明明是要 reinstall,為什麼錯誤訊息是說不能安裝阿,Orz

ASUS 商用 PC - D620MT-2
在官方網站找到該篇文章 - 從電腦解除安裝 Office,由提供工具可以移除 PC 上全部的 Office 相關軟體,下載執行後才順利移除全部的 Office 365,>.<

ASUS 商用 PC - D620MT-3

移除一個 Office 365 語言版本,最少超過 15 分鐘,因為移除到螢幕保護程式都開始執行了,還好有這個工具可以幫忙