Как я могу отобразить DateTimePicker в DataGridView?
Есть ли способ установить элемент управления DateTimePicker в DataGridView?
Я проверил все возможные свойства, но дал опцию флажок, поле со списком и т.д., но не DateTimePicker.
Ответы
Ответ 1
Вы не пропустили какой-либо встроенный параметр, но можно подклассифицировать классы DataGridViewColumn
и DataGridViewCell
для размещения любого элемента управления по вашему выбору.
В этой статье о MSDN более подробно описывается процесс и даже включает пример кода:
Практическое руководство. Управление хостами в окнах DataGridView ячеек Windows Forms
Вы также можете найти полный образец кода проекта: Общий DataGridView V2.0
Ответ 2
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
Чтобы решить некоторые проблемы с записью при использовании DateTimePicker в DataGridView, вы захотите добавить следующее к образцу Microsoft, упомянутому выше. Понадобилось довольно много времени, чтобы найти проблемы с событием valuechanged, которое не срабатывает, как ожидалось. Исправление произошло здесь (fooobar.com/questions/341933/...) и переведено на С# ниже. Мне показалось целесообразным добавить эту информацию здесь, так как я продолжаю находить это сообщение на форуме при поиске в DataGridView и 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);
}
Ответ 4
Может быть, это не правильно, но простой трюк и тот же результат........ намного меньше кода...... Я просто играл вокруг и, хотя вне коробки, просто установил
Я скрываю свое, пока не нажимает на ячейку, или вы можете показать
Сначала я заявил:
DateTimePicker1.Visible = False
когда вы щелкаете в ячейке, запустите этот код...
DateTimePicker1.Visible = True
ActiveControl = DateTimePicker1
Затем ниже
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 Basic, и я сижу прямо в коробке, не выгляжу неуместно
Или супер легкий режим....... Я просто хочу скрыть шахту до нажатия столбца
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
Вам действительно нужна только одна строка..... данные будут в сетке, всего намного меньше кода.....
Ответ 5
Я думаю, что событие CloseUp в DateTimePicker более подходит, потому что измененное значение запускается при любых изменениях, в то время как CloseUp запускается только при выборе всей даты