2 回答
TA贡献1818条经验 获得超7个赞
您的应用程序挂起,因为更改绘制事件中的值将导致无限循环。
该事件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 事件中的任何单元格值!
TA贡献1776条经验 获得超12个赞
绘制事件通常由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;
每次数据更改时都执行此操作。
但您应该使用计算列:
- 2 回答
- 0 关注
- 121 浏览
添加回答
举报