【问题标题】:calendar column c# in datagridviewdatagridview中的日历列c#
【发布时间】:2013-08-19 20:21:55
【问题描述】:

基本上,当我在 Datagridview 中编辑某些列时,我想显示一个日历。

按照来自 MSDN 的 How to: Host Controls in Windows Forms DataGridView Cells,我可以在构建时添加想要的类型的列。

但在我的情况下,我必须使用 Excel 阅读器提供的 数据源,它必须将标题连接到 日期类型 列。

private DataGridView AddCalendars(DataGridView dtgv)
{
  dtgv.DataSource = controller.getEmptyDataTable();     // DataTable provided by excel reader
  var l = dtgv.Columns.Count;
  string[] dateColumns = {"date_received", "date_of_birth"};
  for (var i = 0; i < l; ++i)
  {
    if ( dateColumns.Any( dtgv.Columns[i].HeaderText.Contains )
    {
      dtgv.Columns[i] = new CalendarColumn();      // this line does not work cause by readonly
    }
  }
  return dtgv;
}

如何将日历列控件应用于选定的列?

或者,我怎样才能通过不同的方式构建 Datagridview 来获得相同的结果?

【问题讨论】:

    标签: c# datagridview calendar-control


    【解决方案1】:

    找到一个可接受的解决方案来解决这个帖子http://www.codeproject.com/Questions/175124/placing-datetimepicker-in-datagridview

    private DateTimePicker cellDateTimePicker;
    private List<int> dateColumnsIndexes;
    
    public MainForm()
    {
      InitializeComponent();
    
      /// 
      this.cellDateTimePicker = new DateTimePicker();
      this.cellDateTimePicker.ValueChanged += new EventHandler(cellDateTimePickerValueChanged);
      this.cellDateTimePicker.Visible = false;
      this.cellDateTimePicker.CustomFormat = "dd/MM/yyyy";
      this.cellDateTimePicker.Format = DateTimePickerFormat.Custom;
      this.dataGridView1.Controls.Add(cellDateTimePicker);
      (...)
    }
    
    private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
      var index = masterDataGridView.CurrentCell.ColumnIndex;
      if (this.dateColumnsIndexes.Contains(index))
      {
        Rectangle tempRect = this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);          
        cellDateTimePicker.Location = tempRect.Location;
        cellDateTimePicker.Width = tempRect.Width;
        try
        {
          cellDateTimePicker.Value = DateTime.Parse(dataGridView1.CurrentCell.Value.ToString());
        }
        catch
        {
          cellDateTimePicker.Value = DateTime.Now;
        }
        cellDateTimePicker.Visible = true;
      }
    }
    
    void cellDateTimePickerValueChanged(object sender, EventArgs e)
    {
      masterDataGridView.CurrentCell.Value = cellDateTimePicker.Value.ToString("dd/MM/yyyy");
      cellDateTimePicker.Visible = false;
    }
    
    private void AddCalendars(DataGridView dtgv)
    {
      dateColumnsIndexes = new List<int>();
      dtgv.DataSource = controller.getEmptyDataTable();     // DataTable provided by excel reader
      var l = dtgv.Columns.Count;
      string[] dateColumns = {"date_received", "date_of_birth"};
      for (var i = 0; i < l; ++i)
      {
        if ( dateColumns.Any( dtgv.Columns[i].HeaderText.Contains )
        {
          dateColumnsIndexes.add(i);
        }
     }
    

    }

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多