2011-01-27 3 views

risposta

25

Non hai perso nessuna opzione integrata, ma è possibile suddividere in sottoclasse entrambe le classi DataGridViewColumn e DataGridViewCell per ospitare qualsiasi controllo di tua scelta.

Questo articolo su MSDN spiega il processo in modo più dettagliato, e comprende anche alcuni esempi di codice:
How to: Host Controls in Windows Forms DataGridView Cells

si possono anche trovare un campione completo sul codice del progetto: Generic DataGridView V2.0

4
private void dgtest_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == 0) 
     { 
      dtp = new DateTimePicker(); 
      dgtest.Controls.Add(dtp); 
      dtp.Format = DateTimePickerFormat.Short; 
      Rectangle Rectangle = dgtest.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); 
      dtp.Size = new Size(Rectangle.Width, Rectangle.Height); 
      dtp.Location = new Point(Rectangle.X, Rectangle.Y); 

      dtp.CloseUp += new EventHandler(dtp_CloseUp); 
      dtp.TextChanged += new EventHandler(dtp_OnTextChange); 


      dtp.Visible = true; 
     } 
    } 
    private void dtp_OnTextChange(object sender, EventArgs e) 
    { 

     dgtest.CurrentCell.Value = dtp.Text.ToString(); 
    } 
    void dtp_CloseUp(object sender, EventArgs e) 
    { 
     dtp.Visible = false; 
    } 
+3

Questo è un blocco di codice piuttosto grande - puoi modificarlo per includere alcune spiegazioni su come indirizza la domanda ? – josliber

1

Per risolvere alcuni problemi di immissione quando si utilizza DateTimePicker in un oggetto DataGridView si desidera aggiungere quanto segue all'esempio Microsoft di cui sopra. Ci è voluto un po 'di tempo per cercare i problemi con l'evento valuechanged che non sparava come previsto. La correzione è arrivata da qui (stackoverflow) e tradotta in C# sotto. Mi è sembrato opportuno aggiungere queste informazioni qui mentre continuo a cercare questo post sul forum quando eseguo una ricerca su DataGridView e DateTimePicker.

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

     switch (keyData & Keys.KeyCode) 
     { 
      case Keys.Enter: 
      case Keys.Tab: 
       this.dataGridView.Focus(); 
       break; 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 

    } 
0

Forse questo non è corretto, ma trucco facile e stesso risultato ........ molto meno codice ...... Stavo solo giocando intorno e anche se fuori dagli schemi, basta impostare

mi nascondere il mio finché non scattano delle cellule, o si può mostrare Prima ho dichiarato:

DateTimePicker1.Visible = False 

quando si fa clic nella cella, esegue questo codice ...

DateTimePicker1.Visible = True 
    ActiveControl = DateTimePicker1 

Poi sotto

Public Sub DateTimePicker1_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.ValueChanged 



    requestDGV.Rows(0).Cells("requestTimeOff").Value = (DateTimePicker1.Value) 
    DateTimePicker1.Visible = False 
    DateTimePicker1.Enabled = False 

End Sub 

Super base, e ce l'ho seduto direttamente nella casella, non sembra fuori luogo

O super facile modalità ....... mi piace per nascondere la mia fino colonna cliccare

Public Sub DateTimePicker1_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.ValueChanged 


    requestDGV.Rows(0).Cells("requestTimeOff").Value = (DateTimePicker1.Value) 

End Sub 

È davvero solo bisogno che una linea ..... dati saranno nella griglia, solo un sacco meno codice .....

0

penso che l'evento CloseUp o n DateTimePicker è più appropriato perché il valore modificato si attiva in qualsiasi modifica mentre CloseUp si attiva solo quando è selezionata l'intera data