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
  • 添加一个
    DataGridViewTextBox
    列,并将其名称设置为“B”
  • 处理
    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());
    }