如何:Windows窗体DataGridView单元中的主机控件 [英] How to: Host Controls in Windows Forms DataGridView Cells
问题描述
我想在datagridview中添加datetimepicker。这是我试过的代码。
I want to add a datetimepicker in datagridview . This is the code i tried .
Imports 系统
Imports System.Windows.Forms
公共 类 CalendarColumn
继承 DataGridViewColumn
公开 Sub New ()
MyBase 。新(新 CalendarCell())
结束 < span style ="color:blue"> Sub 公共 覆盖 属性 CellTemplate() As DataGridViewCell
获取 返回 MyBase .CellTemplate
结束 获取 设置( ByVal 值 As DataGridViewCell)
'确保用于模板的单元格是CalendarCell。 如果(值 IsNot Nothing ) AndAlso _
不值。< span style ="color:blue"> GetType ()。IsAssignableFrom( GetType (CalendarCell))_
然后 抛出 新 InvalidCastException("必须是CalendarCell")
结束 如果 MyBase .CellTemplate = value
结束 设置 结束 属性 结束 类 公共 类 CalendarCell
继承 DataGridViewTextBoxCell
公共 Sub < span style ="color:blue"> New ()
'使用短日期格式。 我 .Style.Format = " d" 结束 子 公共 覆盖 Sub InitializeEditingControl( ByVal rowIndex
ByVal initialFormattedValue 作为 对象,_
ByVal dataGridViewCellStyle As DataGridViewCellStyle)
'将编辑控件的值设置为当前单元格值。 MyBase .InitializeEditingControl(rowIndex,initialFormattedValue,_
dataGridViewCellStyle)
昏暗 ctl 作为 CalendarEditingControl = _
CType (DataGridView.EditingControl ,CalendarEditingControl)
ctl.Value = CType ( Me .Value,DateTime)
结束 Sub 公共 覆盖 ReadOnly 属性 EditType() As 键入
获取 '返回CalendarCell使用的编辑控件的类型。 返回 GetType (CalendarEditingControl)
结束 获取 结束 属性 公共 覆盖 ReadOnly 属性 ValueType( ) As 键入
获取 '返回类型CalendarCell包含的值ns。 返回 GetType (DateTime)
结束 获取 结束 属性 公共 覆盖 ReadOnly 属性 DefaultNewRowValue()作为 对象 获取 '使用当前日期和时间作为默认值。 返回 DateTime.Now
结束 获取 结束 属性 结束 类 < span style ="color:blue">类 CalendarEditingControl
Inherits DateTimePicker
Implements IDataGridViewEditingControl
Private dataGridViewControl As DataGridView
私有 valueIsChanged 正如 布尔 = 错误 私人 rowIndexNum 作为 整数 公共 Sub New ()
Me 。格式= DateTimePickerFormat。短 结束 Sub < span style ="color:blue">公共 属性 EditingControlFormattedValue()作为 对象 _
Implements IDataGridViewEditingControl.EditingControlFormattedValue
获取 返回 我 .Value.ToShortDateString()
End 获取 设置( ByVal 值 As 对象)
如果 TypeOf 值 字符串 然后 我 .Value = DateTime.Parse( CStr (值))
结束 如果 结束 设置 结束 属性 公共 函数 GetEditingControlFormattedValue( ByVal context _
As DataGridViewDataErrorContexts)作为 对象 _
实现 IDataGridViewEditingControl。 GetEditingControlFormattedValue
返回 我 .Value.ToShortDateString()
结束 功能 公共 Sub ApplyCellStyleToEditingControl( ByVal dataGridViewCellStyle As _
DataGridViewCellStyle)_
Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
Me .Font = dataGridViewCellStyle.Font
Me .CalendarForeColor = dataGridViewCellStyle.ForeColor
Me .CalendarMonthBackground = dataGridViewCellStyle.BackColor
结束 Sub 公共 属性 EditingControlRowIndex()作为 整数 _
Implements IDataGridViewEditingControl.EditingControlRowIndex
获取 返回 rowIndexNum
< span style ="color:blue"> End 获取 设置( ByVal 值 As 整数)
rowIndexNum = value
结束 设置 结束 属性 公共 功能 EditingControlWantsInputKey( ByVal 键作为键,_
ByVal dataGridViewWantsInputKey As 布尔)作为 布尔 _
Implements IDataGridViewEditingControl.EditingControlWantsInputKey
'让DateTimePicker处理列出的键。 选择 案例键和 Keys.KeyCode
案例 Keys.Left,Keys.Up,Keys.Down,Keys.Right,_
Keys .Home,Keys。 End ,Keys.PageDown,Keys.PageUp
返回 True 案例 其他 返回 False 结束 选择 结束 功能 公共 Sub PrepareEditingControlForEdit( ByVal selectAll As < span style ="color:blue"> Boolean )_
Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
'无需做任何准备。 结束 Sub Public ReadOnly Property RepositionEditingControlOnValueChange()_
As Boolean Implements _
IDataGridViewEditingControl。 RepositionEditingControlOnValueChange
获取 返回 False 结束 获取 结束 < span style ="color:blue">属性 公共 属性 EditingControlDataGridView() As DataGridView _
实现 IDataGridViewEditingC ontrol.EditingControlDataGridView
获取 返回 dataGridViewControl
End 获取 设置( ByVal 值 As DataGridView)
dataGridViewControl = value
结束 设置 结束 属性 公共 属性 EditingControlValueChanged()作为 Boolean _
Implements IDataGridViewEditingControl.EditingControlValueChanged
获取 返回 valueIsChanged
结束 获取 设置( ByVal 值作为 布尔)
valueIsChanged = value
结束 设置 结束 属性 公共 ReadOnly 属性 EditingControlCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursor
获取 返回 MyBase .Cursor
结束 获取 结束 属性 受保护 覆盖 Sub OnValueChanged( ByVal eventargs As EventArgs)
'通知DataGridView内容单元格已更改。
valueIsChanged = True Me .EditingControlDataGridView.NotifyCurrentCellDirty ( True )
MyBase .OnValueChanged(eventargs)
< span style ="color:blue">结束 Sub 结束 Class Public Class Form1
继承表单
私有 dataGridView1 As 新 DataGridView()
< STAThreadAttribute()> _
公开 共享 Sub Main()
Application.Run( New Form1())
End < span style ="color:blue"> Sub 公共 Sub New ()
Me .dataGridView1.Dock = DockStyle.Fill
我 .Controls.Add( Me .dataGridView1)
我。 Text = "DataGridView日历列演示" 结束 Sub 私有 Sub Form1_Load( ByVal sender 作为 对象,< span style ="color:blue"> ByVal e As EventArgs)_
句柄 我 .Load
Dim col As New CalendarColumn()
Me .dataGridView1.Columns。添加(col)
我 .dataGridView1.RowCount = 5
Dim 行< span style ="color:blue"> As DataGridViewRow
对于 每行行在 我 .dataGridView1.Rows
row.Cells(0).Value = DateTime.Now
下一步行
结束 子 结束 Class
Imports System Imports System.Windows.Forms PublicClass CalendarColumn Inherits DataGridViewColumn PublicSubNew() MyBase.New(New CalendarCell()) EndSubPublicOverridesProperty CellTemplate() As DataGridViewCell GetReturnMyBase.CellTemplate EndGetSet(ByVal value As DataGridViewCell) ' Ensure that the cell used for the template is a CalendarCell.If (value IsNotNothing) AndAlso _ Not value.GetType().IsAssignableFrom(GetType(CalendarCell)) _ ThenThrowNew InvalidCastException("Must be a CalendarCell") EndIfMyBase.CellTemplate = value EndSetEndPropertyEndClassPublicClass CalendarCell Inherits DataGridViewTextBoxCell PublicSubNew() ' Use the short date format.Me.Style.Format = "d"EndSubPublicOverridesSub InitializeEditingControl(ByVal rowIndex AsInteger, _ ByVal initialFormattedValue AsObject, _ ByVal dataGridViewCellStyle As DataGridViewCellStyle) ' Set the value of the editing control to the current cell value.MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _ dataGridViewCellStyle) Dim ctl As CalendarEditingControl = _ CType(DataGridView.EditingControl, CalendarEditingControl) ctl.Value = CType(Me.Value, DateTime) EndSubPublicOverridesReadOnlyProperty EditType() As Type Get' Return the type of the editing contol that CalendarCell uses.ReturnGetType(CalendarEditingControl) EndGetEndPropertyPublicOverridesReadOnlyProperty ValueType() As Type Get' Return the type of the value that CalendarCell contains.ReturnGetType(DateTime) EndGetEndPropertyPublicOverridesReadOnlyProperty DefaultNewRowValue() AsObjectGet' Use the current date and time as the default value.Return DateTime.Now EndGetEndPropertyEndClassClass CalendarEditingControl Inherits DateTimePicker Implements IDataGridViewEditingControl Private dataGridViewControl As DataGridView Private valueIsChanged AsBoolean = FalsePrivate rowIndexNum AsIntegerPublicSubNew() Me.Format = DateTimePickerFormat.ShortEndSubPublicProperty EditingControlFormattedValue() AsObject _ Implements IDataGridViewEditingControl.EditingControlFormattedValue GetReturnMe.Value.ToShortDateString() EndGetSet(ByVal value AsObject) IfTypeOf value IsStringThenMe.Value = DateTime.Parse(CStr(value)) EndIfEndSetEndPropertyPublicFunction GetEditingControlFormattedValue(ByVal context _ As DataGridViewDataErrorContexts) AsObject _ Implements IDataGridViewEditingControl.GetEditingControlFormattedValue ReturnMe.Value.ToShortDateString() EndFunctionPublicSub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As _ DataGridViewCellStyle) _ Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl Me.Font = dataGridViewCellStyle.Font Me.CalendarForeColor = dataGridViewCellStyle.ForeColor Me.CalendarMonthBackground = dataGridViewCellStyle.BackColor EndSubPublicProperty EditingControlRowIndex() AsInteger _ Implements IDataGridViewEditingControl.EditingControlRowIndex GetReturn rowIndexNum EndGetSet(ByVal value AsInteger) rowIndexNum = value EndSetEndPropertyPublicFunction EditingControlWantsInputKey(ByVal key As Keys, _ ByVal dataGridViewWantsInputKey AsBoolean) AsBoolean _ Implements IDataGridViewEditingControl.EditingControlWantsInputKey ' Let the DateTimePicker handle the keys listed.SelectCase key And Keys.KeyCode Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _ Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp ReturnTrueCaseElseReturnFalseEndSelectEndFunctionPublicSub PrepareEditingControlForEdit(ByVal selectAll AsBoolean) _ Implements IDataGridViewEditingControl.PrepareEditingControlForEdit ' No preparation needs to be done.EndSubPublicReadOnlyProperty RepositionEditingControlOnValueChange() _ AsBooleanImplements _ IDataGridViewEditingControl.RepositionEditingControlOnValueChange GetReturnFalseEndGetEndPropertyPublicProperty EditingControlDataGridView() As DataGridView _ Implements IDataGridViewEditingControl.EditingControlDataGridView GetReturn dataGridViewControl EndGetSet(ByVal value As DataGridView) dataGridViewControl = value EndSetEndPropertyPublicProperty EditingControlValueChanged() AsBoolean _ Implements IDataGridViewEditingControl.EditingControlValueChanged GetReturn valueIsChanged EndGetSet(ByVal value AsBoolean) valueIsChanged = value EndSetEndPropertyPublicReadOnlyProperty EditingControlCursor() As Cursor _ Implements IDataGridViewEditingControl.EditingPanelCursor GetReturnMyBase.Cursor EndGetEndPropertyProtectedOverridesSub OnValueChanged(ByVal eventargs As EventArgs) ' Notify the DataGridView that the contents of the cell have changed. valueIsChanged = TrueMe.EditingControlDataGridView.NotifyCurrentCellDirty(True) MyBase.OnValueChanged(eventargs) EndSubEndClassPublicClass Form1 Inherits Form Private dataGridView1 AsNew DataGridView() <STAThreadAttribute()> _ PublicSharedSub Main() Application.Run(New Form1()) EndSubPublicSubNew() Me.dataGridView1.Dock = DockStyle.Fill Me.Controls.Add(Me.dataGridView1) Me.Text = "DataGridView calendar column demo"EndSubPrivateSub Form1_Load(ByVal sender AsObject, ByVal e As EventArgs) _ HandlesMe.Load Dim col AsNew CalendarColumn() Me.dataGridView1.Columns.Add(col) Me.dataGridView1.RowCount = 5 Dim row As DataGridViewRow ForEach row InMe.dataGridView1.Rows row.Cells(0).Value = DateTime.Now Next row EndSubEndClass
推荐答案
嗨Vino Nagu,
Hi Vino Nagu,
感谢您在此发帖。
此论坛与MSBuild有关,因为您的问题与有关。
Windows窗体,我们帮助您将其移至正确的论坛以获得更好的支持。
This forum is about the MSBuild, as your issue is more related to the Windows Forms, we help you move it to correct forum for better support.
如果您有一些MSBuild问题,请随时与我们联系。我们将尽力为您提供解决方案。
If you have some MSBuild questions, please feel free to contact us. We will try our best to give you a solution.
感谢您的理解与合作。
这篇关于如何:Windows窗体DataGridView单元中的主机控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!