如果性能問題是因爲Decrypt
方法,你應該在的言論部分提到避免使用它在CellFormatting
事件的單證:
的CellFormatting
事件發生於每個單元是畫的時間,所以 處理該事件時,你應該避免冗長的處理。
我可以使用什麼解決方案爲第二列提供基於第一列的值?
您可以使用這些選項:
- 添加第二列
DataGridView
並在for循環中提供的價值。
- 將第二列添加到您的數據源(例如您的
DataTable
)並在for循環中提供值。
例
在下面的示例,如果從數據庫加載數據不作任何區別。但是,爲了提供一個最小的完整可驗證的例子,我自己創建了DataTable
。在這兩個例子LoadData
方法,加載DataTable
:
private DataTable LoadData()
{
var dt = new DataTable();
dt.Columns.Add("ExistingColumn");
dt.Rows.Add("x");
dt.Rows.Add("y");
dt.Rows.Add("z");
return dt;
}
實施例1 - 添加列的DataGridView
var dt = LoadData();
dataGridView1.DataSource = dt;
//Add new column to DataGridView
var newColumn = new DataGridViewTextBoxColumn();
newColumn.HeaderText = "NewColumn";
newColumn.Name = "NewColumn";
dataGridView1.Columns.Add(newColumn);
//Copy Values
foreach (DataGridViewRow r in this.dataGridView1.Rows)
{
if(!r.IsNewRow)
r.Cells["NewColumn"].Value = Decrypt(r.Cells["ExistingColumn"].Value.ToString());
}
實施例2 - 添加列到數據表
var dt = LoadData();
dataGridView1.DataSource = dt;
//Add new column to DataTable
dt.Columns.Add("NewColumn");
//Copy Values
foreach (DataRow r in dt.Rows)
r["NewColumn"] = Decrypt(r.Field<string>("ExistingColumn");
如果問題實際上是CellPainting,則可以使用DoubleBuffered DGV。如果解密是,那麼你可以把解密的值放在Cell.Tag中,但這可能不是你想要的安全方式.. – TaW
@TaW它的doublebuffered dgv。 – X11
可以肯定的是:您使用DoubleBuffered DataGridView __subclass__? (許多新手相信他們可以通過Form的DoubleBuffered屬性爲所有控件啓用DoubleBuffering ..) – TaW