WinForm自带的DataGridView不能对某些特定单元格进行能否获取焦点的控制的。通过重写DataGridView的DataGridView.OnKeyDown, DataGridView.ProcessDataGridViewKey, DataGridView.SetCurrentCellAddressCore, DataGridView.SetSelectedCellCore, DataGridView.OnMouseDown的方法可以实现对焦点的控制逻辑。
下面的示例通过通过重写DataGridView的SetCurrentCellAddressCore和SetSelectedCellCore的方法,实现控制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); } } }
转载请注明出处!!!