承载 DateTimePicker 控件的 DataGridColumnStyle(C#)

DataGridTimePickerColumn类代码
using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;

public class DataGridTimePickerColumn : DataGridColumnStyle 
    
{
        
private DateTimePicker myDateTimePicker = new DateTimePicker();
        
private bool isEditing;

        
public DataGridTimePickerColumn() : base() 
        
{
            myDateTimePicker.Visible 
= false;
        }


        
protected override void Abort(int rowNum)
        
{
            isEditing 
= false;
            myDateTimePicker.ValueChanged 
-= new EventHandler(TimePickerValueChanged);
            Invalidate();
        }


        
protected override bool Commit(CurrencyManager dataSource, int rowNum) 
        
{
            myDateTimePicker.Bounds 
= Rectangle.Empty;
         
            myDateTimePicker.ValueChanged 
-= new EventHandler(TimePickerValueChanged);

            
if (!isEditing)
            
{
                
return true;
            }


            isEditing 
= false;

            
try 
            
{
                DateTime value 
= myDateTimePicker.Value;
                SetColumnValueAtRow(dataSource, rowNum, value);
            }
 
            
catch (Exception) 
            
{
                Abort(rowNum);
                
return false;
            }


            Invalidate();
            
return true;
        }


        
protected override void Edit(
            CurrencyManager source, 
            
int rowNum,
            Rectangle bounds, 
            
bool readOnly,
            
string instantText, 
            
bool cellIsVisible) 
        
{
            DateTime value 
= (DateTime)GetColumnValueAtRow(source, rowNum);
            
if (cellIsVisible) 
            
{
                myDateTimePicker.Bounds 
= new Rectangle(bounds.X + 2, bounds.Y + 2
                                                bounds.Width 
- 4, bounds.Height - 4);
                myDateTimePicker.Value 
= value;
                myDateTimePicker.Visible 
= true;
                myDateTimePicker.ValueChanged 
+= new EventHandler(TimePickerValueChanged);
            }
 
            
else 
            
{
                myDateTimePicker.Value 
= value;
                myDateTimePicker.Visible 
= false;
            }


            
if (myDateTimePicker.Visible)
            
{
                DataGridTableStyle.DataGrid.Invalidate(bounds);
            }

        }


        
protected override Size GetPreferredSize(Graphics g, object value) 
        
{
            
return new Size(100, myDateTimePicker.PreferredHeight + 4);
        }


        
protected override int GetMinimumHeight() 
        
{
            
return myDateTimePicker.PreferredHeight + 4;
        }


        
protected override int GetPreferredHeight(Graphics g, object value) 
        
{
            
return myDateTimePicker.PreferredHeight + 4;
        }


        
protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum) 
        
{
            Paint(g, bounds, source, rowNum, 
false);
        }

        
protected override void Paint(
            Graphics g, 
            Rectangle bounds,
            CurrencyManager source, 
            
int rowNum,
            
bool alignToRight) 
        
{
            Paint(
                g,bounds, 
                source, 
                rowNum, 
                Brushes.Red, 
                Brushes.Blue, 
                alignToRight);
        }

        
protected override void Paint(
            Graphics g, 
            Rectangle bounds,
            CurrencyManager source, 
            
int rowNum,
            Brush backBrush, 
            Brush foreBrush,
            
bool alignToRight) 
        
{
            DateTime date 
= (DateTime)GetColumnValueAtRow(source, rowNum);
            Rectangle rect 
= bounds;
            g.FillRectangle(backBrush,rect);
            rect.Offset(
02);
            rect.Height 
-= 2;
            g.DrawString(date.ToString(
"d"), this.DataGridTableStyle.DataGrid.Font, foreBrush, rect);
        }


        
protected override void SetDataGridInColumn(DataGrid value) 
        
{
            
base.SetDataGridInColumn(value);
            
if (myDateTimePicker.Parent != null
            
{
                myDateTimePicker.Parent.Controls.Remove(myDateTimePicker);
            }

            
if (value != null
            
{
                value.Controls.Add(myDateTimePicker);
            }

        }


        
private void TimePickerValueChanged(object sender, EventArgs e) 
        
{
            
this.isEditing = true;
            
base.ColumnStartedEditing(myDateTimePicker);
        }

    }
测试代码
private void Form_Load(object sender, System.EventArgs e)
        
{
            InitForm( dataGrid1 );

            DataTable namesDataTable 
= new DataTable("NamesTable");

            namesDataTable.Columns.Add(
"Name",typeof(string));
            namesDataTable.Columns.Add(
"Date"typeof(DateTime));

            DataSet namesDataSet 
= new DataSet();
            namesDataSet.Tables.Add(namesDataTable);
            dataGrid1.DataSource 
= namesDataSet;
            dataGrid1.DataMember 
= "NamesTable";

            
//添加样式
            AddGridStyle( dataGrid1 );
            AddData( namesDataTable );

            
        }


        
private void AddGridStyle( DataGrid grid)
        
{
            DataGridTableStyle myGridStyle 
= new DataGridTableStyle();
            myGridStyle.GridColumnStyles.Clear();
            myGridStyle.MappingName 
= "NamesTable";

            DataGridTextBoxColumn nameColumnStyle 
= new DataGridTextBoxColumn();
            nameColumnStyle.MappingName 
= "Name";
            nameColumnStyle.HeaderText
= "Name";
            myGridStyle.GridColumnStyles.Add(nameColumnStyle);

            DataGridTimePickerColumn timePickerColumnStyle 
= new DataGridTimePickerColumn();
            timePickerColumnStyle.MappingName 
= "Date";
            timePickerColumnStyle.HeaderText 
= "Date";
            timePickerColumnStyle.Width 
= 100;
            myGridStyle.GridColumnStyles.Add(timePickerColumnStyle);

            grid.TableStyles.Add(myGridStyle);
        }


        
private void AddData( DataTable namesDataTable ) 
        
{
            DataRow dRow 
= namesDataTable.NewRow();
            dRow[
"Name"= "小站";
            dRow[
"Date"= new DateTime(20011201);
            namesDataTable.Rows.Add(dRow);

            dRow 
= namesDataTable.NewRow();
            dRow[
"Name"= "小李";
            dRow[
"Date"= new DateTime(20011204);
            namesDataTable.Rows.Add(dRow);

            dRow 
= namesDataTable.NewRow();
            dRow[
"Name"= "小吴";
            dRow[
"Date"= new DateTime(20011229);
            namesDataTable.Rows.Add(dRow);

            namesDataTable.AcceptChanges();
        }


        
private void InitForm( DataGrid grid)
        
{
            grid.TabStop 
= true;
            grid.TabIndex 
= 1;
        }
posted @ 2006-05-31 14:13  Tim工作室  阅读(413)  评论(0编辑  收藏  举报