C# DataGridView从更新中跳过列
是否有可能跳过或删除C# DataGridView从更新中跳过列,c#,winforms,datagridview,ado.net,C#,Winforms,Datagridview,Ado.net,是否有可能跳过或删除DataGridView中更新到数据库的特定列 我需要防止列更新到数据库,因为列值是加密的,当我解密时,解密的值会更新到数据库 我以前使用过这段代码,但这确实减慢了网格速度 private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (hide == false && e.ColumnIndex == 2 &a
DataGridView
中更新到数据库的特定列
我需要防止列更新到数据库,因为列值是加密的,当我解密时,解密的值会更新到数据库
我以前使用过这段代码,但这确实减慢了网格速度
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (hide == false && e.ColumnIndex == 2 && e.RowIndex != this.dataGridView1.NewRowIndex)
{
e.Value = Decrypt(e.Value.ToString());
}
}
使用此代码更新值:
private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
DataTable changes = ((DataTable)dataGridView1.DataSource).GetChanges();
if (changes != null)
{
MySqlCommandBuilder mcb = new MySqlCommandBuilder(mySqlDataAdapter);
((DataTable)dataGridView1.DataSource).AcceptChanges();
mySqlDataAdapter.UpdateCommand = mcb.GetUpdateCommand();
mySqlDataAdapter.Update(changes);
}
}
根据标题所述,将列的
ReadOnly
属性设置为true就足够了,但由于您希望在网格中显示列的解密值,为了防止在数据库中更新列,可以使用以下选项之一:
- 在列本身中显示加密值,并将update命令更改为不包含更新该特定列的语句
- 可以在另一个未绑定列中显示加密值
stringdecrypt(stringvalue)
方法对加密字符串进行解密。另外,我可以给你一个列“a”,其中包含加密值,作为问题,你想在网格中的“B”列中显示解密值
因此,请执行以下步骤:
- 将“A”列的
属性设置为Visible
false
- 添加一个
列,并将其名称设置为“B”DataGridViewTextBox
- 处理
的DtaGridView
事件,如下所示:CellFormatting
CellFormatting
每次绘制每个单元格时都会发生事件,因此
处理此事件时,应避免冗长的处理过程是的,只需将
DataGridView
列的ReadOnly
属性设置为true
@RezaAghaei我有一列需要解密的加密值,但当值被解密且其他单元格被编辑时,我不想将解密的值更新到数据库中,而只更新编辑的单元格值。@RezaAghaei我需要阻止列更新到数据库,因为列值是加密的,当我解密时,解密的值更新到数据库。根据您问题的新版本,您可以将另一个未绑定列添加到DataGridView
中,并在新的未绑定列中显示解密的内容,而只隐藏加密的列。@RezaAghaei我尝试了这一方法。它可以工作,但在滚动时有相同的性能问题。顺便说一句。我尝试将一个可见列设置为false,并使用以下代码将解密后的A列值获取到B列:dataGridView1[“B”,i].Value=Decrypt(dataGridView1[“A”,i].Value.ToString());但此代码不填充B列。请检查编辑。通常设置cell.Value=Decrypt(Value.ToString())就足够了
但是,由于通过Decrypt
可能会出现性能问题,我检查单元格是否没有值,将设置单元格的值。要使列不可见,请使用此类代码网格。列[“a”]。可见=假代码>顺便说一下,只需在干净的环境中测试解决方案。我认为性能问题与此问题无关,您应该只保留与单个问题相关的问题。如果您有其他问题,请随意问另一个问题:)
private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if(e.ColumnIndex<0 || e.RowIndex<0)
return;
var columnB = grid.Columns[e.ColumnIndex];
if (columnB.Name != "B")
return;
var value = grid.Rows[e.RowIndex].Cells["A"].Value;
if (value == null || value == DBNull.Value)
return;
cell.Value = Decrypt(value.ToString());
}
var cell = grid.Rows[e.RowIndex].Cells["B"];
if (cell.Value== null || cell.Value == DBNull.Value)
{
cell.Value = Decrypt(value.ToString());
}