it-swarm.com.ru

Как я могу отобразить DateTimePicker в DataGridView?

Есть ли способ поместить элемент управления DateTimePicker в DataGridView?

Я проверил все возможные свойства, но это дает возможность флажка, поля со списком и т.д., Но не DateTimePicker.

15
Furqan Sehgal

Вы не пропустили ни одной встроенной опции, но есть возможность создать подклассы классов DataGridViewColumn и DataGridViewCell для размещения любого элемента управления по вашему выбору.

Эта статья на MSDN объясняет процесс более подробно, и даже включает в себя некоторый пример кода:
Как: размещать элементы управления в Windows Forms DataGridView Cells

Вы также можете найти полный пример в Project Code: Generic DataGridView V2.0

26
Cody Gray
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;
    } 
5
rajat

Чтобы решить некоторые проблемы с входом при использовании DateTimePicker в DataGridView, вам нужно добавить следующее в пример Microsoft, указанный выше. Потребовалось много времени, чтобы найти проблемы с событием в значении, которое не сработало, как ожидалось. Исправление пришло отсюда ( stackoverflow ) и переведено на C # ниже. Казалось целесообразным добавить эту информацию здесь, так как я продолжаю находить это сообщение на форуме при поиске в 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);

    }
1
jhersey29

Я думаю, что событие CloseUp на DateTimePicker более уместно, потому что измененное значение срабатывает при любом изменении, в то время как CloseUp срабатывает только при выборе всей даты

0
thomas

Может быть, это не правильно, но простой трюк и тот же результат ........ намного меньше кода ...... Я просто играл и хотя за пределами коробки, просто установить

Я прячу свои, пока они не щелкают по ячейке, или вы можете показать Сначала я объявил:

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

Вам действительно нужна эта строка ..... данные будут в сетке, просто намного меньше кода .....

0
Aaron Webb