2012-09-28 79 views

回答

0

最終實現主要是解決方案,在this文章薩米爾建議。

但是當網格水平滾動條移動時,它需要修復複選框的位置。因此,下面是需要更改的方法:

private void frmSelectAll_Load(object sender, EventArgs e) 
{ 
    AddHeaderCheckBox(); 

    HeaderCheckBox.KeyUp += new KeyEventHandler(HeaderCheckBox_KeyUp); 
    HeaderCheckBox.MouseClick += new MouseEventHandler(HeaderCheckBox_MouseClick); 
    dgvSelectAll.CellValueChanged += new DataGridViewCellEventHandler(dgvSelectAll_CellValueChanged); 
    dgvSelectAll.CurrentCellDirtyStateChanged += new EventHandler(dgvSelectAll_CurrentCellDirtyStateChanged); 
    dgvSelectAll.CellPainting += new DataGridViewCellPaintingEventHandler(dgvSelectAll_CellPainting); 

    BindGridView(); 

    var checkboxHeaderCellRect = dgvSelectAll.GetCellDisplayRectangle(0, -1, false); 
    headerCheckboxRightMargin = (checkboxHeaderCellRect.Width - HeaderCheckBox.Width)/2; 
} 

private int headerCheckboxRightMargin; 

private void ResetHeaderCheckBoxLocation(int ColumnIndex, int RowIndex) 
{ 
    //Get the column header cell bounds 
    Rectangle oRectangle = this.dgvSelectAll.GetCellDisplayRectangle(ColumnIndex, RowIndex, false); 

    Point oPoint = new Point(); 

    oPoint.X = oRectangle.Location.X + (oRectangle.Width - headerCheckboxRightMargin - HeaderCheckBox.Width); 
    oPoint.Y = oRectangle.Location.Y + (oRectangle.Height - HeaderCheckBox.Height)/2 + 1; 

    if (oPoint.X < oRectangle.X) 
    { 
     HeaderCheckBox.Visible = false; 
    } 
    else 
    { 
     HeaderCheckBox.Visible = true; 
    } 

    //Change the location of the CheckBox to make it stay on the header 
    HeaderCheckBox.Location = oPoint; 
}