winform datagridview加自定义列

本文介绍了一种在DataGridView中实现自定义密码列的方法,通过创建自定义列类型和单元格类型来实现密码输入和显示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果,列值显示为密码框,通过自定义列和重绘得到结果
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 有自定义日历列改为文本框列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值