如何使用 DataGridRowPostPaint 事件到达 datagridview

我使用 Windows 应用程序 C# 在 datagridview 中有项目,并且创建了事件DataGrid_RowPostPaint来为 datagridview 中的每一行生成序列号。


现在,当我保存数据时,它正在保存,但没有从窗口退出并挂起,我使用断点来跟踪为什么它在保存后挂起,然后我发现它在这个事件中循环,并且在到达最后一行时不退出数据网格视图。


这是代码:


private void TestsDataGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)

{

    this.TestsDataGrid.Rows[e.RowIndex].Cells["Serial"].Value = (e.RowIndex + 1).ToString();

}

如何更新事件中的代码以退出事件并在到达 datagridview 中的最后一行时结束循环。


守着星空守着你
浏览 45回答 2
2回答

qq_笑_17

您的应用程序挂起,因为更改绘制事件中的值将导致无限循环。该事件RowPostPaint在绘制行后调用。如果更改单元格值,则必须再次调用它才能显示新值!也许将该代码移至其他事件CellValueChanged!以下是在第一列中的单元格第一次更改后将第二个单元格值设置为当前秒的示例:private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e){    int col1 = 0;    int col2 = 1;    if (e.ColumnIndex == col1  && dataGridView1[col1  , e.RowIndex] == null)        dataGridView1[col2 , e.RowIndex].Value = DateTime.Now.Second + "s";}请适应您的条件等等!总结一下:您使用了错误的事件来更改单元格值!- 不要更改 Paint 事件中的任何单元格值!

叮当猫咪

绘制事件通常由Windows应用程序系统管理器的顶级事件处理程序调用。每次控件刷新其内容时都会执行此操作。例如,当移动或调整表单大小、将鼠标移到控件上、从上到下传递 z 顺序时,就会完成此操作...这就是为什么它看起来像是一个循环。您可以使用方法开头的标志来定义不想绘画的条件:private void TestsDataGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e){  if ( !paintRequired ) return;  this.TestsDataGrid.Rows[e.RowIndex].Cells["Serial"].Value = (e.RowIndex + 1).ToString();}在表单加载上放置:paintRequired = true;从数据库加载数据后,在代码中的某个位置编写:paintRequired = true;TestsDataGrid.Refresh();paintRequired = false;每次数据更改时都执行此操作。但您应该使用计算列:
打开App,查看更多内容
随时随地看视频慕课网APP