如何:在 Windows 窗体 DataGridView 单元格中承载控件
来源:互联网 发布:东方财富付费软件 编辑:程序博客网 时间:2024/05/21 15:38
DataGridView 控件提供了多种列类型,使得用户可以通过多种方式输入和编辑值。但是,如果这些列类型无法满足数据输入要求,您也可以使用承载所选控件的单元格创建自己的列类型。要做到这一点,必须定义派生自 DataGridViewColumn 和 DataGridViewCell 的类。您还必须定义派生自 Control 并实现 IDataGridViewEditingControl 接口的类。
下面的代码示例演示如何创建日历列。此列的单元格在普通的文本框单元格中显示日期,但当用户编辑单元格时,就会出现 DateTimePicker 控件。为了避免必须再次实现文本框显示功能,CalendarCell 类从 DataGridViewTextBoxCell 类派生,而不是直接从 DataGridViewCell 类继承。
当从 DataGridViewCell 或 DataGridViewColumn 派生并向派生类添加新属性时,请确保重写 Clone 方法以便在克隆操作期间复制新属性。还应调用基类的 Clone 方法,以便将基类的属性复制到新的单元格或列中。
示例
C#
复制代码
using System;using System.Windows.Forms;public class CalendarColumn : DataGridViewColumn{ public CalendarColumn() : base(new CalendarCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a CalendarCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(CalendarCell))) { throw new InvalidCastException("Must be a CalendarCell"); } base.CellTemplate = value; } }}public class CalendarCell : DataGridViewTextBoxCell{ public CalendarCell() : base() { // Use the short date format. this.Style.Format = "d"; } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); CalendarEditingControl ctl = DataGridView.EditingControl as CalendarEditingControl; ctl.Value = (DateTime)this.Value; } public override Type EditType { get { // Return the type of the editing contol that CalendarCell uses. return typeof(CalendarEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains. return typeof(DateTime); } } public override object DefaultNewRowValue { get { // Use the current date and time as the default value. return DateTime.Now; } }}class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl{ DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public CalendarEditingControl() { this.Format = DateTimePickerFormat.Short; } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue // property. public object EditingControlFormattedValue { get { return this.Value.ToShortDateString(); } set { if (value is String) { this.Value = DateTime.Parse((String)value); } } } // Implements the // IDataGridViewEditingControl.GetEditingControlFormattedValue method. public object GetEditingControlFormattedValue( DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } // Implements the // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. public void ApplyCellStyleToEditingControl( DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; this.CalendarForeColor = dataGridViewCellStyle.ForeColor; this.CalendarMonthBackground = dataGridViewCellStyle.BackColor; } // Implements the IDataGridViewEditingControl.EditingControlRowIndex // property. public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey // method. public bool EditingControlWantsInputKey( Keys key, bool dataGridViewWantsInputKey) { // Let the DateTimePicker handle the keys listed. switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: case Keys.Home: case Keys.End: case Keys.PageDown: case Keys.PageUp: return true; default: return !dataGridViewWantsInputKey; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit // method. public void PrepareEditingControlForEdit(bool selectAll) { // No preparation needs to be done. } // Implements the IDataGridViewEditingControl // .RepositionEditingControlOnValueChange property. public bool RepositionEditingControlOnValueChange { get { return false; } } // Implements the IDataGridViewEditingControl // .EditingControlDataGridView property. public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } // Implements the IDataGridViewEditingControl // .EditingControlValueChanged property. public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } // Implements the IDataGridViewEditingControl // .EditingPanelCursor property. public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnValueChanged(EventArgs eventargs) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnValueChanged(eventargs); }}public class Form1 : Form{ private DataGridView dataGridView1 = new DataGridView(); [STAThreadAttribute()] public static void Main() { Application.Run(new Form1()); } public Form1() { this.dataGridView1.Dock = DockStyle.Fill; this.Controls.Add(this.dataGridView1); this.Load += new EventHandler(Form1_Load); this.Text = "DataGridView calendar column demo"; } private void Form1_Load(object sender, EventArgs e) { CalendarColumn col = new CalendarColumn(); this.dataGridView1.Columns.Add(col); this.dataGridView1.RowCount = 5; foreach (DataGridViewRow row in this.dataGridView1.Rows) { row.Cells[0].Value = DateTime.Now; } }}
- 如何:在 Windows 窗体 DataGridView 单元格中承载控件
- 如何:在 Windows 窗体 DataGridView 单元格中承载控件
- 在 Windows 窗体 DataGridView 单元格中承载控件
- 『转MSDN』如何:在 Windows 窗体 DataGridView 单元格中承载日历控件
- Windows 窗体 DataGridView 控件中的单元格样式
- 演练:在 Windows 窗体中承载 Windows Presentation Foundation 复合控件 【转载】
- 在 Windows 窗体 DataGridView 控件中实现虚拟模式
- DataGridView控件选中单元格、直接在控件中修改信息
- 处理在 Windows 窗体 DataGridView 控件中输入数据时发生的错误
- 在 Windows 窗体 DataGridView 控件中实现实时数据加载的虚拟模式
- 如何:操作 Windows 窗体 DataGridView 控件中的列
- 如何:将数据绑定到 Windows 窗体 DataGridView 控件
- 获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列
- 获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列
- 获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列
- 在datagridview中点击单元格弹出窗体进行选择 返回给原窗体
- 如何在 Windows 服务中承载一个远程对象(remoting)
- C#在datagridview单元格中增加日期控件,实现单元格日期控件下拉
- GRIDVIEW固定表头和表头新式
- 自定义UITableViewCell不能显示圆角的解决方法
- Do it. Do it right. Do it right now!
- 分布式和集群
- 无题
- 如何:在 Windows 窗体 DataGridView 单元格中承载控件
- 基于.NET平台的分层架构实战(五)——接口的设计与实现
- Hibernate HQL查询解析
- Skype 不能开启
- android开发中-使用Dialog ProgressDialog
- 基于.NET平台的分层架构实战(五)——接口的设计与实现
- 源码推荐: SQLite for iOS
- CA认证简单介绍
- 使用Double-Buffer来实现无闪烁动态折线图