问题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;
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);
}
{
Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,
e.RowBounds.Location.Y,
((DataGridView)sender).RowHeadersWidth - 4,
e.RowBounds.Height);
((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);
}
参考: