DataGridView焦点控制

来源:互联网 发布:电子软件开发工程师 编辑:程序博客网 时间:2024/05/20 17:07

WinForm自带的DataGridView不能对某些特定单元格进行能否获取焦点的控制的。通过重写DataGridViewDataGridView.OnKeyDown, DataGridView.ProcessDataGridViewKey, DataGridView.SetCurrentCellAddressCore, DataGridView.SetSelectedCellCore, DataGridView.OnMouseDown的方法可以实现对焦点的控制逻辑。

 

下面的示例通过通过重写DataGridViewSetCurrentCellAddressCoreSetSelectedCellCore的方法,实现控制DataGridView的某一列不能获取焦点。

 

部分代码:

public partial class RestrictFocusForm1 : Form    {        public RestrictFocusForm1()        {            InitializeComponent();        }        private void RestrictFocusForm1_Load(object sender, EventArgs e)        {            DataTable dt = new DataTable();            dt.Columns.Add("c1");            dt.Columns.Add("c2");            dt.Columns.Add("c3");            for (int j = 0; j < 10; j++)            {                dt.Rows.Add("aaa" + j.ToString(), "bbb");            }            this.myDataGridView1.DataSource = dt;            this.myDataGridView1.ColumnToSkip = 1;        }    }    public class myDataGridView : DataGridView    {        private int columnToSkip = -1;        public int ColumnToSkip        {            get { return columnToSkip; }            set { columnToSkip = value; }        }        protected override bool SetCurrentCellAddressCore(int columnIndex, int rowIndex,            bool setAnchorCellAddress, bool validateCurrentCell, bool throughMouseClick)        {            if (columnIndex == this.columnToSkip && this.columnToSkip != -1)            {                if (this.columnToSkip == this.ColumnCount - 1)                {                    return base.SetCurrentCellAddressCore(0, rowIndex + 1,                        setAnchorCellAddress, validateCurrentCell, throughMouseClick);                }                else                {                    if (this.ColumnCount != 0)                    {                        return base.SetCurrentCellAddressCore(columnIndex + 1, rowIndex,                              setAnchorCellAddress, validateCurrentCell, throughMouseClick);                    }                }            }            return base.SetCurrentCellAddressCore(columnIndex, rowIndex,               setAnchorCellAddress, validateCurrentCell, throughMouseClick);        }        protected override void SetSelectedCellCore(int columnIndex, int rowIndex, bool selected)        {            if (columnIndex == this.columnToSkip)            {                if (this.columnToSkip == this.ColumnCount - 1)                {                    base.SetSelectedCellCore(0, rowIndex + 1, selected);                }                else                {                    if (this.ColumnCount != 0)                    {                        base.SetSelectedCellCore(columnIndex + 1, rowIndex, selected);                    }                }            }            else            {                base.SetSelectedCellCore(columnIndex, rowIndex, selected);            }        }    }


 

 

 

转载请注明出处!!!

http://blog.csdn.net/stuqbx

原创粉丝点击