Comment puis-je afficher un DateTimePicker dans un DataGridView?
y a-t-il un moyen de mettre un contrôle DateTimePicker dans le DataGridView?
j'ai coché toutes les propriétés possibles mais il donne l'option de case à cocher, boîte combo etc, mais pas le DateTimePicker.
5 réponses
vous n'avez pas manqué d'option intégrée, mais il est possible de classer les deux DataGridViewColumn
et DataGridViewCell
classes pour héberger tout contrôle de votre choix.
cet article sur MSDN explique le processus plus en détail, et inclut même un code échantillon:
comment: Host Controls in Windows Forms cellules DataGridView
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;
}
pour résoudre quelques problèmes d'entrée lors de L'utilisation du DateTimePicker dans un DataGridView, vous voudrez ajouter ce qui suit à L'échantillon de Microsoft mentionné ci-dessus. Il a fallu un certain temps pour chercher les problèmes avec l'événement valuechanged ne fonctionne pas comme prévu. Le correctif est venu à partir d'ici ( stackoverflow) et traduit en C # ci-dessous. Il a semblé approprié d'ajouter cette information ici que je continue à trouver ce post de forum lors de la recherche sur DataGridView et 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);
}
peut-être que ce n'est pas correct, mais truc facile et même résultat........ beaucoup moins de code......J'étais en train de jouer, et bien que l'extérieur de la boîte, il suffit de mettre
je cache le mien jusqu'à ce qu'ils cliquent sur la cellule, ou vous pouvez montrer J'ai d'abord déclaré :
DateTimePicker1.Visible = False
lorsque vous cliquez dans la cellule, d'exécuter ce code...
DateTimePicker1.Visible = True
ActiveControl = DateTimePicker1
puis en dessous de
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 , et je l'ai assis directement dans la boîte, n'a pas l'air de sortir de la place
ou super facile mode.......Je voudrais simplement cacher la mine jusqu'à la colonne cliquez sur
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
vous avez vraiment besoin de cette ligne.....les données seront dans la grille, juste beaucoup moins de code.....
je pense que le gros plan de l'événement sur DateTimePicker est la plus appropriée car le changement de la valeur de déclenchement sur tout changement, tout en gros plan déclenche uniquement lorsque la totalité de la date est sélectionnée