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 關注
- 190 瀏覽
添加回答
舉報