none
datagridview 事件 RRS feed

  • 問題

  • 大大您们好,我想請問一下,我要再datagridview每個cell做keydown的事件,但我知道直接觸發是不行的,所以我透過網路找了一些方法,有透過textBox的,但我的datagridview並不想再加入textbox,所以我另找了一個複寫ProcessCmdKey,但實驗結果我卻發現,我所有加入的form,只要有做keydown動作,他就會執行底下函式,可否請大大幫幫我,我只想要幾個datagridview必須限制他們的輸入,謝謝
    protected override bool ProcessCmdKey(ref Message aoMsg, Keys aoKey)  
            {
                char ch = (char)aoKey;
                string chstring = ch.ToString();
                string msg="can't input "+chstring+"\r\n"+"Please key 0~9";
                if (chstring.CompareTo("0") < 0 || chstring.CompareTo("9") > 0)
                {
                    if (ch != '\b')
                        MessageBox.Show(msg);
                }
                else if (chstring.ToUpper().CompareTo("A") < 0 || chstring.ToUpper().CompareTo("Z") > 0)
                {
                    if (ch != '\b')
                        MessageBox.Show(msg);
                }
                switch (aoKey)  
                {  
                 case Keys.Enter:
                       
                     MessageBox.Show("Hello");
                    break;  
                }  
                return base.ProcessCmdKey(ref aoMsg, aoKey);             
             } 
    2009年6月8日 上午 07:09

解答

  • 你要用ProcessCmdKey的話
    你需要建個類別繼承Grid
    介面上直接使用你新造的控制項
        class NewGrid:System.Windows .Forms .DataGridView 
        {
            protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
            {
                //TODO:
            }
        }
    你現在應該是直接加到Form裡吧

    可參考

    http://www.dotblogs.com.tw/larrynung/
    2009年6月8日 上午 08:15
  • 自我用 WPF 後,我都用自由格式,所已好久沒用datagridview了.
    但就我以前的經驗.像很多List...複合控制項.你要抓到哪一個Item Control做了什麼事,基本上不簡單,尤其很多是RunTime才組成的Item.
    你要做這個基本上還是用Cell KeyDown的事件或Cell裡的Control事件.
    但很多都無法抓到該事件(如你說的),因為它被上層的控制項包掉了,然而它還是會上層控制項轉發,所以你要去查上層的複合控制像的項關事件再去做處理.而在處理的過程可能型態或訊息...都會被轉換,所以你也要有OO的繼承,多型....概念,將來源轉回原來的Control型態,就能做回你要的功能了.
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:10
    2009年6月8日 上午 08:50
  • 要用自己的控制項
    若是寫成其他Dll的話
    把它加入工具箱用就可以了

    若是再同一份專案
    先建置
    然後切到設計介面
    看工具箱最上方
    若是沒有調整過VS設定
    應該會看到多了你寫的控制項可以用

    若是沒有看到的話
    你需要把設定開啟
    讓VS偵測是否有控制項

    也可以透過程式碼New出物件後
    透過me.Controls.Add(Control)
    把控制項加到介面上

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:10
    2009年6月9日 上午 01:17
  • Hi

    Step1.方案總管上按右鍵=>加入=>類別
    Step2.開啟新增的類別,把新控制項的程式寫進去
        class NewGrid:System.Windows .Forms .DataGridView 
        {
            protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
            {
                //TODO:
            }
        }
    Step3.建置
    Step4.到工具箱去尋找你寫的控制項,把它加入表單上

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:09
    2009年6月9日 上午 02:59

所有回覆

  • 為何不在DataGridView.KeyDown處理
    http://www.dotblogs.com.tw/larrynung/
    2009年6月8日 上午 07:50
  • 大大您好,我有試過,可是keydown在每一個cell裡好像沒有作用,所以才會去網路上找相關資料,謝謝
    2009年6月8日 上午 08:08
  • 你要用ProcessCmdKey的話
    你需要建個類別繼承Grid
    介面上直接使用你新造的控制項
        class NewGrid:System.Windows .Forms .DataGridView 
        {
            protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
            {
                //TODO:
            }
        }
    你現在應該是直接加到Form裡吧

    可參考

    http://www.dotblogs.com.tw/larrynung/
    2009年6月8日 上午 08:15
  • 自我用 WPF 後,我都用自由格式,所已好久沒用datagridview了.
    但就我以前的經驗.像很多List...複合控制項.你要抓到哪一個Item Control做了什麼事,基本上不簡單,尤其很多是RunTime才組成的Item.
    你要做這個基本上還是用Cell KeyDown的事件或Cell裡的Control事件.
    但很多都無法抓到該事件(如你說的),因為它被上層的控制項包掉了,然而它還是會上層控制項轉發,所以你要去查上層的複合控制像的項關事件再去做處理.而在處理的過程可能型態或訊息...都會被轉換,所以你也要有OO的繼承,多型....概念,將來源轉回原來的Control型態,就能做回你要的功能了.
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:10
    2009年6月8日 上午 08:50
  • 大大您好,我了解你說的,那請問我該如何在介面上使用我新造的,我是不是也要呼叫這個類別才行壓,謝謝
    2009年6月9日 上午 12:37
  • 要用自己的控制項
    若是寫成其他Dll的話
    把它加入工具箱用就可以了

    若是再同一份專案
    先建置
    然後切到設計介面
    看工具箱最上方
    若是沒有調整過VS設定
    應該會看到多了你寫的控制項可以用

    若是沒有看到的話
    你需要把設定開啟
    讓VS偵測是否有控制項

    也可以透過程式碼New出物件後
    透過me.Controls.Add(Control)
    把控制項加到介面上

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:10
    2009年6月9日 上午 01:17
  • 大大抱歉,我還是不太懂您的意思,你可以幫我說更清楚ㄧ點嗎,您意思是我要自己寫一個控制項,而這個類別會繼承我寫的控制項,您之前那個網址我有看過,但我不知該如何引用,才會直接寫在form底下的,謝謝

    2009年6月9日 上午 02:44
  • Hi

    Step1.方案總管上按右鍵=>加入=>類別
    Step2.開啟新增的類別,把新控制項的程式寫進去
        class NewGrid:System.Windows .Forms .DataGridView 
        {
            protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
            {
                //TODO:
            }
        }
    Step3.建置
    Step4.到工具箱去尋找你寫的控制項,把它加入表單上

    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年6月9日 上午 03:09
    2009年6月9日 上午 02:59
  • 大大謝謝您的耐心,謝謝我會了

    2009年6月9日 上午 03:09
  • 大大您好,我想再請問你,若是我自動改了它本身的值(如黑體),因為我想要他若輸入非數字時,我的游標就不動,由於我知道IntPtr是指 指標或控制代碼,我這樣的修改會造成電腦問題嗎,謝謝
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message aoMsg, System.Windows.Forms.Keys aoKey)
            {
                char ch = (char)aoKey;
                string chstring = ch.ToString();
                string msg = "can't input " + chstring + "\r\n" + "Please key 0~9";
                if (chstring.CompareTo("0") < 0 || chstring.CompareTo("9") > 0)
                {
                    if (ch != '\b')
                    {
                        MessageBox.Show(msg);
                        aoMsg.WParam = (IntPtr)32;
                    }
                }
                return base.ProcessCmdKey(ref aoMsg, aoKey);
            }

    2009年6月9日 上午 03:26
  • 造成電腦問題是指?!
    當機?!電腦壞掉?!

    應該是不會怎樣吧
    因為你繼承了DataGridView去處理
    這應該指會對你的控制項造成影響

    不過若你是想要游標不動
    試試看把aoMsg.WParam = (IntPtr)32; 改為 return true;
    我是沒試驗
    不過看來應該只要return base.ProcessCmdKey(ref aoMsg, aoKey);這行沒執行到就可以了

    http://www.dotblogs.com.tw/larrynung/
    2009年6月9日 上午 03:39
  • 大大謝謝您囉
    2009年6月9日 上午 03:44