问题1、在更新完DataGridView之后如何让滚动条仍然在更新前的位置
答:用 FirstDisplayedScrollingRowIndex和FirstDisplayedScrollingColumnIndex两个属性,参见下面代码。
问题2、如果用户在一瞬间连续按快捷键进行更新,不应该响应每一个请求。在下面代码中我们用lastUpdateTime解决了问题。
private
void
dgv_KeyDown(
object
sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F5 && DateTime.Now.Subtract(_lastUpdateTime).TotalSeconds > 1 )
{
int row = dgv.FirstDisplayedScrollingRowIndex;
int col = dgv.FirstDisplayedScrollingColumnIndex;
LoadLog();
if (dgv.Rows.Count > 0 )
{
row = row < 0 ? 0 : row;
if (row >= dgv.Rows.Count)
row = dgv.Rows.Count - 1 ;
dgv.FirstDisplayedScrollingRowIndex = row;
col = col < 0 ? 0 : col;
if (col > dgv.Columns.Count)
col = dgv.Columns.Count - 1 ;
dgv.FirstDisplayedScrollingColumnIndex = col;
}
}
}
{
if (e.KeyCode == Keys.F5 && DateTime.Now.Subtract(_lastUpdateTime).TotalSeconds > 1 )
{
int row = dgv.FirstDisplayedScrollingRowIndex;
int col = dgv.FirstDisplayedScrollingColumnIndex;
LoadLog();
if (dgv.Rows.Count > 0 )
{
row = row < 0 ? 0 : row;
if (row >= dgv.Rows.Count)
row = dgv.Rows.Count - 1 ;
dgv.FirstDisplayedScrollingRowIndex = row;
col = col < 0 ? 0 : col;
if (col > dgv.Columns.Count)
col = dgv.Columns.Count - 1 ;
dgv.FirstDisplayedScrollingColumnIndex = col;
}
}
}
问题3、显示行号:
可以在DataGirdView的RowPostPaint事件中进行绘制。
private
void
dgv_RowPostPaint(
object
sender, DataGridViewRowPostPaintEventArgs e)
{
DrawRowIndex(sender, e);
}
private void DrawRowIndex( object sender, DataGridViewRowPostPaintEventArgs e)
{
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
e.RowBounds.Location.Y,
((DataGridView)sender).RowHeadersWidth - 4 ,
e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1 ).ToString(),
((DataGridView)sender).RowHeadersDefaultCellStyle.Font,
rectangle,
((DataGridView)sender).RowHeadersDefaultCellStyle.ForeColor,
TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
{
DrawRowIndex(sender, e);
}
private void DrawRowIndex( object sender, DataGridViewRowPostPaintEventArgs e)
{
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
e.RowBounds.Location.Y,
((DataGridView)sender).RowHeadersWidth - 4 ,
e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1 ).ToString(),
((DataGridView)sender).RowHeadersDefaultCellStyle.Font,
rectangle,
((DataGridView)sender).RowHeadersDefaultCellStyle.ForeColor,
TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}
参考: