using System;
using System.Windows.Forms;
using System.Drawing;
public class MyTextBoxColumn : DataGridViewColumn
{
public MyTextBoxColumn(): base(new MyTextBoxCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&!value.GetType().IsAssignableFrom(typeof(MyTextBoxCell)))
{
throw new InvalidCastException("必须是个文本框");
}
base.CellTemplate = value;
}
}
}
public class MyTextBoxCell :DataGridViewTextBoxCell
{
public MyTextBoxCell():base()
{
}
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{//主要是这里的重绘,显示密码字符
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
//Image _img = Properties.Resources.imgDelete_x16;
Brush gridBrush = new SolidBrush(Color.Blue);
graphics.FillRectangle(gridBrush, cellBounds);
Brush gridBrush1 = new SolidBrush(Color.Red);
graphics.DrawString("****",new Font("宋体",20),gridBrush1, cellBounds.Location.X + 5, cellBounds.Location.Y + 3);
}
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
TextEditingControl ctl = DataGridView.EditingControl as TextEditingControl;//初始化编辑时显示的控件,此控件值也显示为*
try
{
ctl.PasswordChar = '*';
ctl.Text = this.Value.ToString();
}
catch { }
}
public override Type EditType
{
get
{
return typeof(TextEditingControl);
}
}
public override Type ValueType
{
get
{
return typeof(string);
}
}
public override object DefaultNewRowValue
{
get
{
return "abc";
}
}
}
class TextEditingControl :TextBox, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public TextEditingControl()
{
this.PasswordChar='*';
}
public object EditingControlFormattedValue
{
get
{
return this.Text;
}
set
{
this.Text = value.ToString();
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.PasswordChar='*';
}
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
{
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;
}
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
protected override void OnTextChanged(EventArgs eventargs)
{
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(eventargs);
}
}
调用:
窗体上拖一个datagridview,然后添加数据
MyTextBoxColumn col = new MyTextBoxColumn();
this.dataGridView1.Columns.Clear();
this.dataGridView1.Columns.Add(col);
this.dataGridView1.RowCount = 5;
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
row.Cells[0].Value = "dddd";
}
参考: http://hi.baidu.com/jackyc/item/e60e593a656433ffdf2221e6 有自定义日历列改为文本框列