Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Keydown Event σε DataGrid(Το αγνοεί)?

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος J_S στις 20-12-2005, 16:27. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-10-2005, 10:35 6093

    Keydown Event σε DataGrid(Το αγνοεί)?

    Έχω ένα datagrid(VS 2003) που το γεμίζω από ένα datatable.Τα columns του datatable τα έχω δηλώσει readonly εκτός από τα δυο τελευταία που είναι boolean(checkboxes).

    Θέλω κάθε φορά που είμαι μέσα στο grid Και πατάω ένα κουμπι να κάνει κάτι.
    Έχω λοιπόν απλά δηλώσει το default keydown event του datagrid:
    private void dataGrid1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

            {

                if(e.KeyCode == Keys.Escape)

                {

                    allOnAlg.Focus();

                }

            }


    Αλλά δεν δουλεύει. Όταν είμαι σε ένα Cell και πατάω κουμπί, δείχνει να το αγνοεί.Δεν μπαίνει κάν στο event.
    Δοκίμασα να κάνω όλα τα πεδία read-write αλλά πάλι τίποτα.
    Το περίεργο είναι ότι αν πατήσω το κουμπί στα boolean πεδία τότε το δέχεται το event Huh? [:^)]
    Αλλά εγώ το θέλω για όλα τα πεδία.

    Καμοιά ιδέα?
    Ευχαριστώ Smile [:)]


  •  11-10-2005, 11:22 6095 σε απάντηση της 6093

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Τα πράγματα δεν είναι και τόσο απλά. Τα KeyDown, KeyPress, KeyUp events αφορούν το grid, όχι τα κελιά του. Για να μπορέσεις να πιάσεις events στα ίδια τα κελιά έχεις δύο επιλογές:
    1. Κάνεις το KeyPreview της φόρμας True και χειρίζεσαι το KeyDown της φόρμας. Απλό γρήγορο και βρώμικο.
    2. Χειρίζεσαι τα events της στήλης. Για να το κάνεις αυτό πρέπει να έχεις ορίσει DataTableGridStyle για το grid.

        'in formload
         Me.dataGrid2.DataSource = Me.dataSet11.Customers ' set the data source
          
     
         'make sure grid has a tablestyle
         Dim ts As New DataGridTableStyle()
         ts.MappingName = Me.dataSet11.Customers.TableName
         Me.dataGrid2.TableStyles.Add(ts)
     
     
         'now we can wire up wire up events for columns 1 and 4 ....
         Dim tbc as DataGridTextBoxColumn = CType(ts.GridColumnStyles(0), DataGridTextBoxColumn)
         AddHandler tbc.TextBox.KeyPress, AddressOf CellKeyPress
     
         tbc = CType(ts.GridColumnStyles(3), DataGridTextBoxColumn)
         AddHandler tbc.TextBox.KeyPress, AddressOf CellKeyPress
     
         .....
     
     
         'the handler
         Private Sub CellKeyPress(sender As Object, e As KeyPressEventArgs)
              'don't allow 1's
              If e.KeyChar = "1"c Then
                   e.Handled = True
              End If
         End Sub 'CellKeyPress
     

    Μπορείς να βρεις αυτό το παράδειγμα  καθώς και απαντήσεις σε άλλες ερωτήσεις στο George Shepherd's Windows Forms FAQ


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-10-2005, 12:47 6100 σε απάντηση της 6095

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Δεν δούλεψε.Εξακολουθεί να αγνοεί το event Sad [:(]
    Ιδού και η συνάρτηση ανάθεσης
    private void somefuncBefore()

    {

                dataGrid1.DataSource=dt;

               
    dataGrid1.RowHeadersVisible=true;       
       

                dataGrid1.CaptionVisible=true;

                addGridCellEvents();

    }



    private void addGridCellEvents()

            {

                DataGridTableStyle ts = new DataGridTableStyle();

                DataGridTextBoxColumn tbc = null;



                try

                {

                    ts.MappingName = dt.TableName;

                    dataGrid1.TableStyles.Add(ts);



                   

                    //Column 1

                    tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[0];

               
        tbc.TextBox.KeyDown += new
    System.Windows.Forms.KeyEventHandler(this.dataGrid1_KeyDown);

                   

                    //Column 2

                    tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[1];

               
        tbc.TextBox.KeyDown += new
    System.Windows.Forms.KeyEventHandler(this.dataGrid1_KeyDown);

                   

                    //Column 3

                    tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[2];

               
        tbc.TextBox.KeyDown += new
    System.Windows.Forms.KeyEventHandler(this.dataGrid1_KeyDown);

                   

                    //Column 4

                    tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[3];

               
        tbc.TextBox.KeyDown += new
    System.Windows.Forms.KeyEventHandler(this.dataGrid1_KeyDown);

                   

                    //Column 5

                    tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[4];

               
        tbc.TextBox.KeyDown += new
    System.Windows.Forms.KeyEventHandler(this.dataGrid1_KeyDown);

                   

                   

                }

                catch(Exception ex)

                {

                    string err = ex.Message;

                }

            }



    Σημειώνω ότι στα πεδία που είναι boolean πετάει Exception στην γραμμή "tbc = (DataGridTextBoxColumn)ts.GridColumnStyles[3];" οπότε δεν τις έβαλα αφού έτσι και αλλιώς αυτές δίνουν event.
  •  11-10-2005, 14:29 6102 σε απάντηση της 6100

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Σε εμένα όμως δουλεύει, και ο δικός σου κώδικας! Για δοκίμασε με μια απλή φόρμα, ένας πίνακας, μία στήλη, χωρίς exception handling.

    Όσον αφορά το cast που αποτυγχάνει, είναι λογικό αφού η στήλη περιλαμβάνει checkboxes. Το κατάλληλο style σε αυτή την περίπτωση είναι το DataGridBoolColumn
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-10-2005, 09:32 6114 σε απάντηση της 6102

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Ωραία.Είχα μια πρόοδο.Δέχται όλα τα keystrokes εκτός από αυτό που θέλω. Το Escape!!Angry [:@]Crying [:'(](Μέρφυ ακούςAngry [:@])
    Επίσης δεν δέχεται τα Up,Down(τα left,right τα δέχεται) ,F2 ,F4.
    Τα υπόλοιπα τα δέχεται πάντως.
    Τι στην οργή συμβαίνει?
  •  12-10-2005, 09:45 6115 σε απάντηση της 6114

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Πλέον είμαι σίγουρος.Το VS  εκπαιδεύεται. Angry [:@]Angry [:@]
    Πλέον ούτε τα left,rigth τα δέχεται........
    Μου θυμίζει το Middle mouse event Που όσο ξαφνικά άρχισε να δουλεύει τόσο ξαφνικά σταμάτησε....Angry [:@]
  •  18-10-2005, 09:31 6229 σε απάντηση της 6093

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Τελικά η απάντηση βρίσκεται εδώ:

    A reasonable question is why not just use the event mechanism of the existing TextBox to modify behavior. Events like KeyPress would allow us to do some things PROVIDED they get hit. Due to the key processing architecture of the FrameWork, for some special keys, these key events are not always fired. And if they are fired, sometimes it is impossible to avoid the default processing if this is the intent you have. Overriding a virtual function, doing something special, and then NOT calling the baseclass is a standard way of avoiding default processing.

    Στην ίδια σελίδα που μου παρέθεσες pkanavos.Sad [:(]

    Και για τον ίδιο λόγο αυτό:

    1. Κάνεις το KeyPreview της φόρμας True και χειρίζεσαι το KeyDown της φόρμας. Απλό γρήγορο και βρώμικο.

    δεν δούλεψε.Sad [:(]

    Ευτυχώς τουλάχιστο στο VS2005 το έφτοιαξαν καλό το grid Component τους.Το δοκίμασα εκεί δουλεύει.

  •  20-12-2005, 16:27 8133 σε απάντηση της 6093

    Απ: Keydown Event σε DataGrid(Το αγνοεί)?

    Ίσως μια γρήγορη λύση να είναι κάνεις override την ακόλουθη ρουτίνα (ProcessCmdKey) της φόρμας στην οποία ανήκει το Grid :

    (Στο συγκεκριμένο παράδειγμα έχω απενεργοποιήσει το key up όταν είσαι μέσα στο Grid , εσύ θα μπορούσες να καλείς μια δική σου ρουτίνα για να κάνει κάτι...)

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
    bool result;

    if ((ActiveControl is DataGridTextBox))
    {
    if (keyData == Keys.Up)
    {
    return true;
    }
    }

    result = base.ProcessCmdKey (ref msg, keyData);
    return result;
    }
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems