• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[C#]CalendarColumn cho DataGridView

Các thủ thuật liên quan đến ứng dụng, biểu mẫu và control

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
QuanGL
VIP
VIP
Bài viết: 76
Ngày tham gia: T.Năm 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Been thanked: 4 time

[C#]CalendarColumn cho DataGridView

Gửi bàigửi bởi QuanGL » T.Bảy 07/03/2009 7:09 pm

Thủ thuật: CalendarColumn cho DataGridView
Tác giả: ">MSDN và tui :D
Mô tả: Kết hợp DateTimeControl vào trong DataGridView


File Program.cs:
Thêm đoạn code này zô sau static class Program {

  1.        public class CalendarColumn : DataGridViewColumn
  2.         {
  3.             public CalendarColumn()
  4.                 : base(new CalendarCell())
  5.             {
  6.             }
  7.  
  8.             public override DataGridViewCell CellTemplate
  9.             {
  10.                 get
  11.                 {
  12.                     return base.CellTemplate;
  13.                 }
  14.                 set
  15.                 {
  16.                     // Ensure that the cell used for the template is a CalendarCell.
  17.                     if (value != null &&
  18.                         !value.GetType().IsAssignableFrom(typeof(CalendarCell)))
  19.                     {
  20.                         throw new InvalidCastException("Must be a CalendarCell");
  21.                     }
  22.                     base.CellTemplate = value;
  23.                 }
  24.             }
  25.         }
  26.  
  27.         public class CalendarCell : DataGridViewTextBoxCell
  28.         {
  29.  
  30.             public CalendarCell()
  31.                 : base()
  32.             {
  33.                 // Use the short date format.
  34.                 this.Style.Format = "dd'/'MM'/'yyyy hh':'mm tt";
  35.             }
  36.  
  37.             public override void InitializeEditingControl(int rowIndex, object
  38.                 initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
  39.             {
  40.                 // Set the value of the editing control to the current cell value.
  41.                 base.InitializeEditingControl(rowIndex, initialFormattedValue,
  42.                     dataGridViewCellStyle);
  43.                 CalendarEditingControl ctl = DataGridView.EditingControl as CalendarEditingControl;
  44.                 if (this.Value != DBNull.Value && (string)this.Value != "")
  45.                     ctl.Value = (DateTime)this.Value;
  46.             }
  47.  
  48.             public override Type EditType
  49.             {
  50.                 get
  51.                 {
  52.                     // Return the type of the editing contol that CalendarCell uses.
  53.                     return typeof(CalendarEditingControl);
  54.                 }
  55.             }
  56.  
  57.             public override Type ValueType
  58.             {
  59.                 get
  60.                 {
  61.                     // Return the type of the value that CalendarCell contains.
  62.                     return typeof(DateTime);
  63.                 }
  64.             }
  65.  
  66.             public override object DefaultNewRowValue
  67.             {
  68.                 get
  69.                 {
  70.                     // Use the current date and time as the default value.
  71.                     //return DateTime.Now;
  72.                     return "";
  73.                 }
  74.             }
  75.         }
  76.  
  77.         class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
  78.         {
  79.             DataGridView dataGridView;
  80.             private bool valueChanged = false;
  81.             int rowIndex;
  82.  
  83.             public CalendarEditingControl()
  84.             {
  85.                 this.CustomFormat = "dd'/'MM'/'yyyy hh':'mm tt";
  86.                 this.Format = DateTimePickerFormat.Custom;
  87.             }
  88.  
  89.             // Implements the IDataGridViewEditingControl.EditingControlFormattedValue
  90.             // property.
  91.             public object EditingControlFormattedValue
  92.             {
  93.                 get
  94.                 {
  95.                     return this.Value.ToString();
  96.                 }
  97.                 set
  98.                 {
  99.                     if (value is String)
  100.                     {
  101.                         this.Value = DateTime.Parse((String)value);
  102.                     }
  103.                 }
  104.             }
  105.  
  106.             // Implements the
  107.             // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
  108.             public object GetEditingControlFormattedValue(
  109.                 DataGridViewDataErrorContexts context)
  110.             {
  111.                 return EditingControlFormattedValue;
  112.             }
  113.  
  114.             // Implements the
  115.             // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
  116.             public void ApplyCellStyleToEditingControl(
  117.                 DataGridViewCellStyle dataGridViewCellStyle)
  118.             {
  119.                 this.Font = dataGridViewCellStyle.Font;
  120.                 this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
  121.                 this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
  122.             }
  123.  
  124.             // Implements the IDataGridViewEditingControl.EditingControlRowIndex
  125.             // property.
  126.             public int EditingControlRowIndex
  127.             {
  128.                 get
  129.                 {
  130.                     return rowIndex;
  131.                 }
  132.                 set
  133.                 {
  134.                     rowIndex = value;
  135.                 }
  136.             }
  137.  
  138.             // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
  139.             // method.
  140.             public bool EditingControlWantsInputKey(
  141.                 Keys key, bool dataGridViewWantsInputKey)
  142.             {
  143.                 // Let the DateTimePicker handle the keys listed.
  144.                 switch (key & Keys.KeyCode)
  145.                 {
  146.                     case Keys.Left:
  147.                     case Keys.Up:
  148.                     case Keys.Down:
  149.                     case Keys.Right:
  150.                     case Keys.Home:
  151.                     case Keys.End:
  152.                     case Keys.PageDown:
  153.                     case Keys.PageUp:
  154.                         return true;
  155.                     default:
  156.                         return false;
  157.                 }
  158.             }
  159.  
  160.             // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
  161.             // method.
  162.             public void PrepareEditingControlForEdit(bool selectAll)
  163.             {
  164.                 // No preparation needs to be done.
  165.             }
  166.  
  167.             // Implements the IDataGridViewEditingControl
  168.             // .RepositionEditingControlOnValueChange property.
  169.             public bool RepositionEditingControlOnValueChange
  170.             {
  171.                 get
  172.                 {
  173.                     return false;
  174.                 }
  175.             }
  176.  
  177.             // Implements the IDataGridViewEditingControl
  178.             // .EditingControlDataGridView property.
  179.             public DataGridView EditingControlDataGridView
  180.             {
  181.                 get
  182.                 {
  183.                     return dataGridView;
  184.                 }
  185.                 set
  186.                 {
  187.                     dataGridView = value;
  188.                 }
  189.             }
  190.  
  191.             // Implements the IDataGridViewEditingControl
  192.             // .EditingControlValueChanged property.
  193.             public bool EditingControlValueChanged
  194.             {
  195.                 get
  196.                 {
  197.                     return valueChanged;
  198.                 }
  199.                 set
  200.                 {
  201.                     valueChanged = value;
  202.                 }
  203.             }
  204.  
  205.             // Implements the IDataGridViewEditingControl
  206.             // .EditingPanelCursor property.
  207.             public Cursor EditingPanelCursor
  208.             {
  209.                 get
  210.                 {
  211.                     return base.Cursor;
  212.                 }
  213.             }
  214.  
  215.             protected override void OnValueChanged(EventArgs eventargs)
  216.             {
  217.                 // Notify the DataGridView that the contents of the cell
  218.                 // have changed.
  219.                 valueChanged = true;
  220.                 this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
  221.                 base.OnValueChanged(eventargs);
  222.             }
  223.         }
  224.  
  225.  


Để dùng được phải Build project lại
Cách dùng:
- Add DataGridView
- Add Column cho DataGridView này, chọn Type là CalendarColumn
- Format mặc định là "dd'/'MM'/'yyyy hh':'mm tt";, mún sửa thì zô trong Program.cs đổi thành định dạng mong muốn (có 2 chỗ, edit cả 2) :D


I'm in the mood for love

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: [C#]CalendarColumn cho DataGridView

Gửi bàigửi bởi tungcan5diop » T.Hai 09/03/2009 9:19 am

khi bạn nhập một ngày khác và Double Click vào DateTimePicker thì bị lỗi như hình sau....cách giải quyết bạn rem 2 dòng ngay tại báo lỗi và mở 2 dòng đã rem dưới 2 dòng đó
Tập tin đính kèm
error.JPG
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: [C#]CalendarColumn cho DataGridView

Gửi bàigửi bởi tungcan5diop » T.Sáu 13/03/2009 2:49 pm

Convert cái của QuanGL từ C# sang Vb.net để xài thử...(đã fix một số bug từ cái cũ)
cách tạo vô cùng đơn giản,add new một cái Class...và past đoạn code sau vào,nhớ là Ctrl+A và Crtl+V luôn nha...cách xài kéo một cái DataGridView từ Toolboxs,click chuột phải vào lứơi chọn Add Column...chọn Type như trong hình
code
  1. Public Class CalendarColumn
  2.     Inherits DataGridViewColumn
  3.     Public Sub New()
  4.         MyBase.New(New CalendarCell())
  5.     End Sub
  6.  
  7.     Public Overloads Overrides Property CellTemplate() As DataGridViewCell
  8.         Get
  9.             Return MyBase.CellTemplate
  10.         End Get
  11.         Set(ByVal value As DataGridViewCell)
  12.             ' Ensure that the cell used for the template is a CalendarCell.
  13.             If value IsNot Nothing AndAlso Not value.[GetType]().IsAssignableFrom(GetType(CalendarCell)) Then
  14.                 Throw New InvalidCastException("Must be a CalendarCell")
  15.             End If
  16.             MyBase.CellTemplate = value
  17.         End Set
  18.     End Property
  19. End Class
  20. Class CalendarEditingControl
  21.     Inherits DateTimePicker
  22.     Implements IDataGridViewEditingControl
  23.     Private dataGridView As DataGridView
  24.     Private bvalueChanged As Boolean = False
  25.     Private rowIndex As Integer
  26.  
  27.     Public Sub New()
  28.         Me.CustomFormat = "dd'/'MM'/'yyyy hh':'mm tt"
  29.         Me.Format = DateTimePickerFormat.[Custom]
  30.     End Sub
  31.  
  32.     ' Implements the IDataGridViewEditingControl.EditingControlFormattedValue
  33.     ' property.
  34.     Public Property EditingControlFormattedValue() As Object Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
  35.         Get
  36.             Return Me.Value.ToString()
  37.         End Get
  38.         Set(ByVal value As Object)
  39.             If TypeOf value Is String Then
  40.                 Me.Value = DateTime.Parse(DirectCast(value, String))
  41.             End If
  42.         End Set
  43.     End Property
  44.  
  45.     ' Implements the
  46.     ' IDataGridViewEditingControl.GetEditingControlFormattedValue method.
  47.     Public Function GetEditingControlFormattedValue(ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
  48.         Return EditingControlFormattedValue
  49.     End Function
  50.  
  51.     ' Implements the
  52.     ' IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
  53.     Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle) Implements System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
  54.         Me.Font = dataGridViewCellStyle.Font
  55.         Me.CalendarForeColor = dataGridViewCellStyle.ForeColor
  56.         Me.CalendarMonthBackground = dataGridViewCellStyle.BackColor
  57.     End Sub
  58.  
  59.  
  60.     ' Implements the IDataGridViewEditingControl.EditingControlRowIndex
  61.     ' property.
  62.     Public Property EditingControlRowIndex() As Integer Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
  63.         Get
  64.             Return rowIndex
  65.         End Get
  66.         Set(ByVal value As Integer)
  67.             rowIndex = value
  68.         End Set
  69.     End Property
  70.  
  71.     ' Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
  72.     ' method.
  73.     Public Function EditingControlWantsInputKey(ByVal keyData As System.Windows.Forms.Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlWantsInputKey
  74.         ' Let the DateTimePicker handle the keys listed.
  75.         Select Case keyData And Keys.KeyCode
  76.             Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, Keys.Home, Keys.[End], _
  77.             Keys.PageDown, Keys.PageUp
  78.                 Return True
  79.             Case Else
  80.                 Return False
  81.         End Select
  82.     End Function
  83.  
  84.     ' Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
  85.     ' method.
  86.     Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
  87.  
  88.     End Sub
  89.  
  90.     Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
  91.         Get
  92.             Return False
  93.         End Get
  94.     End Property
  95.  
  96.     ' Implements the IDataGridViewEditingControl
  97.     ' .EditingControlDataGridView property.
  98.     Public Property EditingControlDataGridView() As System.Windows.Forms.DataGridView Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
  99.         Get
  100.             Return dataGridView
  101.         End Get
  102.         Set(ByVal value As DataGridView)
  103.             dataGridView = value
  104.         End Set
  105.     End Property
  106.  
  107.     ' Implements the IDataGridViewEditingControl
  108.     ' .EditingControlValueChanged property.
  109.     Public Property EditingControlValueChanged() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
  110.         Get
  111.             Return bvalueChanged
  112.         End Get
  113.         Set(ByVal value As Boolean)
  114.             bvalueChanged = value
  115.         End Set
  116.     End Property
  117.  
  118.     ' Implements the IDataGridViewEditingControl
  119.     ' .EditingPanelCursor property.
  120.     Public ReadOnly Property EditingPanelCursor() As System.Windows.Forms.Cursor Implements System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
  121.         Get
  122.             Return MyBase.Cursor
  123.         End Get
  124.     End Property
  125.  
  126.     Protected Overloads Overrides Sub OnValueChanged(ByVal eventargs As EventArgs)
  127.         ' Notify the DataGridView that the contents of the cell
  128.         ' have changed.
  129.         bvalueChanged = True
  130.         Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
  131.         MyBase.OnValueChanged(eventargs)
  132.     End Sub
  133. End Class
  134.  
  135. Public Class CalendarCell
  136.     Inherits DataGridViewTextBoxCell
  137.     Public Sub New()
  138.         MyBase.New()
  139.         ' Use the short date format.
  140.         Me.Style.Format = "dd'/'MM'/'yyyy hh':'mm tt"
  141.     End Sub
  142.  
  143.     Public Overloads Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
  144.         ' Set the value of the editing control to the current cell value.
  145.         MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
  146.         Dim ctl As CalendarEditingControl = TryCast(DataGridView.EditingControl, CalendarEditingControl)
  147.         If Me.Value Is Nothing Then
  148.             Exit Sub
  149.         End If
  150.         Dim newdate As Date
  151.         Dim d As Int32 = 0
  152.         Dim t As Int32 = 0
  153.         Dim n As Int32 = 0
  154.         Dim s() As String
  155.         If Me.Value IsNot DBNull.Value AndAlso Me.Value.ToString().Trim() <> "" Then
  156.             s = CType(Me.Value, String).Split("/")
  157.             d = CType(s(0), Int32)
  158.             t = CType(s(1), Int32)
  159.             n = CType(s(2).Substring(0, 4), Int32)
  160.             newdate = New Date(n, t, d)
  161.             'ctl.Value = DirectCast(Me.Value, DateTime)
  162.             ctl.Value = newdate
  163.         End If
  164.     End Sub
  165.  
  166.     Public Overloads Overrides ReadOnly Property EditType() As Type
  167.         Get
  168.             ' Return the type of the editing contol that CalendarCell uses.
  169.             Return GetType(CalendarEditingControl)
  170.         End Get
  171.     End Property
  172.  
  173.     Public Overloads Overrides ReadOnly Property ValueType() As Type
  174.         Get
  175.             ' Return the type of the value that CalendarCell contains.
  176.             Return GetType(DateTime)
  177.         End Get
  178.     End Property
  179.  
  180.     Public Overloads Overrides ReadOnly Property DefaultNewRowValue() As Object
  181.         Get
  182.             ' Use the current date and time as the default value.
  183.             'return DateTime.Now;
  184.             Return ""
  185.         End Get
  186.     End Property
  187. End Class
Tập tin đính kèm
01.JPG
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!


Quay về “[.NET] Ứng dụng - Form và Control”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách