C# 任何列中DataGridView标题中的日历

C# 任何列中DataGridView标题中的日历,c#,winforms,datagridview,calendar,C#,Winforms,Datagridview,Calendar,是否可以在任何列的DataGridView标题中添加日历选择器 大概是这样的: 我以这种方式处理了类似于Excel过滤器的效果 显然,您必须构建日历控件。 使用WPF数据网格更容易 如果希望产生这种影响,可以尝试在DataGridView中实现此事件: private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button == Mou

是否可以在任何列的DataGridView标题中添加日历选择器

大概是这样的:


我以这种方式处理了类似于Excel过滤器的效果

显然,您必须构建日历控件。 使用WPF数据网格更容易

如果希望产生这种影响,可以尝试在DataGridView中实现此事件:

private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        DataGridView dg = (DataGridView)sender;
        BindingSource bs = (BindingSource)dg.DataSource;

        //TODO;
    }
    else if (e.Button == MouseButtons.Right)
    {        
        FrmMyCalendar f = new FrmMyCalendar();
        f.Location = new Point(Cursor.Position.X, Cursor.Position.Y);

        //TODO   
    }
}
您可以考虑通过ElementHost缓慢地引入网格WPF

是的。。。这是可能的

DateTimePicker dtPicker;

private void Form_Load(object sender, EventArgs e)
{
    dtPicker = new DateTimePicker();
    dtPicker.Format = DateTimePickerFormat.Short;
    dtPicker.Visible = false;
    dtPicker.Width = 100;
    dgT.Controls.Add(dtPicker);
    dtPicker.ValueChanged += this.dtPicker_ValueChanged;
    dgT.CellBeginEdit += this.dgT_CellBeginEdit;
    dgT.CellEndEdit += this.dgT_CellEndEdit;
}

private void dgT_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    try
    {
        if ((dgT.Focused) && (dgT.CurrentCell.ColumnIndex == 2))   // Here you can define on which column DateTimePicker will be activated
        {
            dtPicker.Location = dgT.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false).Location;
            dtPicker.Visible = true;

            if (dgT.CurrentCell.Value != DBNull.Value)
            {
                dtPicker.Value = (DateTime)dgT.CurrentCell.Value;
            }
            else
            {
                dtPicker.Value = DateTime.Today;
            }
        }
        else
        {
            dtPicker.Visible = false;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void dgT_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        if ((dgT.Focused) && (dgT.CurrentCell.ColumnIndex == 2))
        {
            dgT.CurrentCell.Value = dtPicker.Value.Date;                       
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void dtPicker_ValueChanged(object sender, EventArgs e)
{
    dgT.CurrentCell.Value = dtPicker.Text;
}

private void dgT_Scroll(object sender, ScrollEventArgs e)
{
    dtPicker.Visible = false;
}
只需将
DataGridView
放在表单a上。在我的例子中,我把它命名为
dgT