星期二, 7月 30, 2024

[C#] DataGridView - CurrentCellDirtyStateChanged 事件

使用 DataGridViewCheckBoxColumn 時,都習慣性使用 CellValueChanged Event 來處理判斷,發現同事判斷是使用 CurrentCellDirtyStateChanged Event,在官方文章 DataGridViewCheckBoxColumn 備註內有相關事件說明,分別為
  • CellContentClick
  • CellValueChanged
  • CurrentCellDirtyStateChanged

CellContentClick VS CellValueChanged

以 CellContentClick 和 CellValueChanged 來比較的話,假如 DataGridViewCheckBoxColumn (ThreeState 為預設 false) 值目前為 false 來舉例的話
  • CellContentClick:更新前,抓到 false
  • CellValueChanged:更新後,抓到 true

CurrentCellDirtyStateChanged

而本篇筆記重點 CurrentCellDirtyStateChanged 事件,則是可以在該事件內判斷 DataGridViewCheckBoxColumn 是否更新
namespace CurrentCellDirtyStateChangedEvent
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            List<Source> sources = new List<Source>();
            sources.Add(new Source() { Selected = false });
            sources.Add(new Source() { Selected = false });
            dataGridView1.DataSource = sources;

            dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_CurrentCellDirtyStateChanged;
            dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            // CommitEdit() 後,會立即觸發 CellValueChanged
            string value = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            txtEventTrigger.Text += $"CellValueChanged 觸發 => RowIndex:{e.RowIndex},值:{value}" + Environment.NewLine;
        }

        private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            var dgv = sender as DataGridView;
            if (dgv == null)
                return;

            // 透過 IsCurrentCellDirty 判斷資料是否變更
            if (dgv.IsCurrentCellDirty == false)
                return;
ˇ
            if (dgv.CurrentCell.ColumnIndex != ColSelected.Index)
                return;

            // 第一筆資料會進行 commit,可以進行 true、false 切換
            // 第二筆資料則是會取消使用者點擊,只會維持在 false
            if (dgv.CurrentRow.Index % 2 == 0)
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
            else
                dataGridView1.CancelEdit();
        }
    }

    public class Source
    {
        public bool Selected { get; set; }
    }
}

點擊第一筆會進行 CommitEdit 並觸發 CellValueChanged 事件,可以從右側資訊觀察,點擊第二筆資料則是 CancelEdit(),會一直維持在 false 狀態

CommitEdit() VS EndEdit()

看到 Code 最大疑惑是為什麼不用 EndEdit() 而是 CommmitEdit(),確認官方文件後發現,原來 CommitEdit() 會維持在編輯狀態,而 EndEdit() 則是會結束編輯狀態
Commits changes in the current cell to the data cache without ending edit mode.

Commits and ends the edit operation on the current cell.
編輯狀態可以透過 DataGridViewCell.IsInEditMode Property 來判斷,把上述語法修正來觀察
private void DataGridView1_CurrentCellDirtyStateChanged(object? sender, EventArgs e)
{
    if (dgv.CurrentRow.Index % 2 == 0)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        txtEventTrigger.Text += $"CommitEdit IsInEditMode:{dataGridView1.CurrentCell.IsInEditMode}" + Environment.NewLine;
    }
    else
    {
        dataGridView1.EndEdit();
        txtEventTrigger.Text += $"EndEdit IsInEditMode:{dataGridView1.CurrentCell.IsInEditMode}" + Environment.NewLine;
    }
}

星期六, 7月 27, 2024

[CCNA] Cisco Packet Tracer - 遠端連線

遠端登錄裝置通常都會設定密碼來驗證,有兩種驗證方式分別為 [遠端登錄密碼] 和 [特權模式密碼],而連線方式可以區分為
  • Out-of-Band:Console
  • In-Band:Telnet
簡易網路建置如下
設定密碼

設定遠端登錄密碼,密碼為 passremote

設定特權模式密碼,有兩種 CLI 指令,分別為
  • password 自訂密碼
  • password secret 自訂密碼
兩者差異在於加密情況,password 為明碼,而 password secret 會用 MD5 加密

使用 show running-config 來查詢,可以看見設定特權模式密碼,不同 CLI 語法設定後的效果

Console

利用 Console 線,從 PC0 RS232 連線至 Router0 Console 

在 PC0 上透過 Terminal 來連線至 Router0



Console 不須輸入遠端登錄密碼,進入特權模式需要輸入密碼而已

Telnet

從 PC1 透過 Telnet 來登錄 Router0

星期五, 7月 26, 2024

[CCNA] Cisco Packet Tracer - 基礎網路建置

在 Cisco Packet Tracer 上建置一個基礎網路環境,如下圖
Connections

一律使用 Copper Straight-Through 來連接

IP Config

PC、Laptop 直接透過 GUI 畫面設定,Switch 使用 CLI 語法、Router 則是根據網路卡,兩者都記錄

Router GUI 設定畫面

Router CLI 設定畫面

Switch 設定畫面

Laptop 設定畫面
其他沒有記錄到就以此類推囉

測試

從 Switch 進行測試
從 Laptop 進行測試

Port Status 預設值

設定完成後發現 Switch 和 Router 之間連接線沒有通,原來 Router Port Status 預設為 off,Switch 預設為 on,打開後才順利連接


星期四, 7月 25, 2024

[CCNA] Cisco Packet Tracer - ping

建立一個基礎網路環境,來記錄三種 ping 方式,分別為
  • Packet Tracer GUI 功能
  • 命令提示字元
  • CLI    
藉此來測試網路是否設定正確


Packet Tracer GUI 功能

GUI 上有個封包 (信封) 圖式,點選該圖式後,先去點選來源設備,再點選目的設備,就可以達到測試需求

從Packet Tracer 右下角的  Realtime 內可以見從 PC0 => Router1 和 Router1 => PC0 的測試紀錄
命令提示字元


CLI

星期二, 7月 23, 2024

[SQL] 爆量資料量

使用者反應某個統計介面在那轉圈圈,畫面出不來,直覺是那流程資料量那麼少,是發生甚麼事情,看執行計畫發現兩處資料量爆炸情況
  • A Table 資料筆數 3,193 筆資料,但 operator 顯示讀出 8,250,712 筆資料,超出 2500 倍資料量
  • B Table 資料筆數 82,826 筆資料,但 operator 驚嘆號訊息提到,實際讀 138,236,594 筆資料,但只拋出 53,807,超出 1600 倍資料量
執行計畫如下
該統計牽涉到 4 個 Table,只有 1 個 Table 資料筆數在 8 萬筆左右,其他 3 個 Table 都是 4,000 筆以下,當初規劃時除了 PK 外還真的都沒有建立對應 Index,把相關 Index 建起來,CPU Time 就從 7 秒變成瞬間秒殺,執行計畫也相對正常

星期二, 7月 16, 2024

[CCNA] Cisco Packet Tracer - 系統時間

透過設定設備系統時間來熟悉 CLI 內的語法輸入,使用 CLI 語法如下

星期四, 7月 11, 2024

[CCNA] Cisco Packet Tracer - Command

從官方文章 - Cicso IOS Command Hierarchy 理解 Command 階層

官方圖示
Commands
  • >:User Exec Commands
  • #:Privileged Exec Commads
  • config:Global Configuration Commands
  • config-文字:Specific Commands,以下圖來說是進入 config-if

星期日, 7月 07, 2024

[CCNA] Cisco Packet Tracer - 設備增刪

紀錄新增刪除設備

新增

點選下方設備清單並選擇要新增的設備,以 Switch 2960 為例

點選 Switch 2960 後,2960 圖示會變成禁止符號,表示要新增該設備,但只能新增一個


萬一要新增多個 Switch 2960 的話,點選 2960 時,要先按住 Ctrl 按鍵後,再去點選 Switch 2960,這樣在 Logical 內就可以新增多個 Switch 2960 了

刪除

上圖圖示為刪除按鈕,可以選擇單一或多個設備後,去按該按鈕,就會進行刪除,個人是習慣按 del 按鈕來進行刪除,會比較方便

星期三, 7月 03, 2024

[CCNA] Cisco Packet Tracer - Customize User Experience

想說不知道有沒有設定選項,可以把 Switch、Router 的 IP 資訊顯示在 Logical 內,在 Preferences 內確認每個選項,發現沒有選項可以勾選,紀錄目前認識的選項功能

Show Device Model Labels

要不要顯示該設備型號,另外一個相似選項是 Show Device Name Labels


Use CLI AS Device Default Tab

原本開啟設備,預設 Physical Page,該選項可以改為 CLI Page



Show Port Labels When Mouse Over in Logical Workspace

把滑鼠移至網路線上就會顯示 Router 是透過 Giga0/0 連線至 Switch Fa0/1 

星期一, 7月 01, 2024

[C#] 使用 Edge 開啟 PDF

在 C# 內使用 Process.Start() 來開啟 PDF,當 PDF 預設是 Adobe Acrobat Reader 時,會發生無法開啟,但是工作管理員內可以看見背景處理程序存在的情況,只能換個方式來開啟

Adobe Reader 版本,紀錄當下是最新版本
偵測 Edge 是否安裝

網路上有兩種方式確認,分別為
  • Edge 執行檔
  • 註冊碼 (regedit)
下方紀錄 [Edge 執行檔] 確認方式,[註冊碼 (regedit)] 請參考 注册表判断是否安装微软Edge浏览器
private bool IsEdgeInstall()
{
    string edgeFullName = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe";
    return File.Exists(edgeFullName);
}

使用 Edge 開啟 PDF     

透過 Process.Start() 來啟動 Edge 並開啟 PDF 檔案
public void OpenPDFByEdge(string pdfFileFullName)
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = "msedge.exe",
        Arguments = pdfFileFullName,
        UseShellExecute = true // .NET Framework 預設為 true、.NET 預設為 false
    };

    Task.Run(() => Process.Start(startInfo));
}