2011-01-27 32 views

Respuesta

25

No ha omitido ninguna opción incorporada, pero es posible subclasificar las clases DataGridViewColumn y DataGridViewCell para alojar cualquier control de su elección.

este artículo en MSDN explica el proceso con más detalle, e incluso incluye un código de ejemplo:
How to: Host Controls in Windows Forms DataGridView Cells

también se puede encontrar una muestra completa sobre el Proyecto Código: 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

Este es un bloque de código bastante grande. ¿Podría editarlo para incluir una explicación de cómo aborda la pregunta? ? – josliber

1

Para resolver algunos problemas de entrada al usar DateTimePicker en un DataGridView, querrá agregar lo siguiente a la muestra de Microsoft mencionada anteriormente. Nos tomó bastante tiempo buscar los problemas con el evento de cambio de valor que no se activó como se esperaba. La solución vino de aquí (stackoverflow) y se tradujo a C# a continuación. Me pareció apropiado agregar esta información aquí, ya que sigo encontrando esta publicación en el foro cuando busco en DataGridView y 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

Tal vez esto no es correcto, pero es fácil truco y mismo resultado ........ mucho menos código ...... yo estaba jugando y aunque fuera de la caja, sólo set

que esconden la mina hasta que encajen celular, o puede mostrar en primer lugar, declaré:

DateTimePicker1.Visible = False 

cuando se hace clic en la celda, ejecuta este código ...

DateTimePicker1.Visible = True 
    ActiveControl = DateTimePicker1 

Luego a continuación

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 

súper básico, y tengo que sentarse directamente en el cuadro, no se ve fuera de lugar

O súper fácil modo de ....... me gusta a ocultar la mina hasta la columna clic

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 

Usted realmente sólo necesita que una línea ..... de datos estará en la red, sólo un montón menos código .....

0

creo que el caso de primeros planos o n DateTimePicker es más apropiado porque el valor modificado se desencadena en cualquier cambio mientras CloseUp solo se activa cuando se selecciona toda la fecha

Cuestiones relacionadas