Как я могу отобразить 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 запускается только при выборе всей даты