如何在用户编辑某些文本后更改背景单元格颜色

时间:2015-04-20 12:56:36

标签: c# winforms datagridview colors

从上一个问题开始,我在编辑后询问了与颜色文本相关的问题。现在已要求我不应突出显示已编辑的文本,而是更改背景颜色。

这就是我现在想要的。

  1. 将包含数据的现有文件加载到DataGridView
  2. 加载后,DataGridView将填充数据
  3. 用户将编辑任何单元格中的文字
  4. 编辑文本后,
  5. 已编辑单元格的背景颜色会将颜色更改为红色
  6. 仅适用于已修改的单元格
  7. 如何在DataGridView

    中更改已编辑单元格的背景颜色

    这是我尝试通过改变单元格的背景颜色。

       private void Gridview_Output_CellBeginEdit_1(object sender, DataGridViewCellCancelEventArgs e)
        {
                DataGridViewCell cell = Gridview_Output[e.ColumnIndex, e.RowIndex];
                cell.Tag = cell.Value != null ? cell.Value : "";
    
                if (cell.OwningColumn.Name == "ValueOut")
                    cell.Style.BackColor = Color.Yellow;
        }
    

    全球

        List<DataGridViewCell> dgvc_List = new List<DataGridViewCell>();
    

    保存按钮

        private void btnSave_Click(object sender, EventArgs e)
        {
             dgvc_List.Add(cell);
                    foreach (DataGridViewCell d in dgvc_List)
                    {
                        d.Style.BackColor = Color.White;
                    }
                    dgvc_List.Clear();
        }
    

3 个答案:

答案 0 :(得分:0)

您可能希望使用TextChanged事件(https://msdn.microsoft.com/en-us/library/system.windows.forms.control.textchanged(v=vs.110).aspx)来检测用户何时更改TextBox的内容(您可能希望在此处应用某些逻辑以避免在加载数据时触发它控制)。当偶数触发时,您可以更改控件的背景颜色(https://msdn.microsoft.com/en-us/library/s2kh9x59(v=vs.110).aspx

答案 1 :(得分:0)

在CellEndEdit上添加一个新事件:

private void Gridview_Output_CellEndEdit_1(object sender, DataGridViewCellCancelEventArgs e)
{
        DataGridViewCell cell = Gridview_Output[e.ColumnIndex, e.RowIndex];
        cell.Tag = cell.Value != null ? cell.Value : "";

        if (cell.OwningColumn.Name == "ValueOut")
            cell.Style.BackColor = Color.Yellow;
}

这是因为您在编辑完成之前调用了事件,而在您完成作业时,您真正想要的是显示不同的颜色。

答案 2 :(得分:0)

进一步说明Donbabbeo已回答......

我认为你只想改变背景仅在时实际更改了单元格值。使用Donbabbeo的答案将改变BackColor,无论每次编辑发生,无论值是否发生变化。

我建议您同时使用CellBeginEditCellEndEdit个事件。

首先,您需要记住&#39;正在编辑的单元格的原始值。

string originalValue; // Define a global outside
    private void Gridview_Output_CellBeginEdit_1(object sender, DataGridViewCellCancelEventArgs e)
    {
        originalValue = Gridview_Output[e.ColumnIndex, e.RowIndex].Value.ToString();  
    }

然后当您完成编辑时,请检查原始值,仅在实际更改时更改背景颜色

private void Gridview_Output_CellEndEdit(object sender, DataGridViewCellEventArgs e)
   {
       DataGridViewCell cell = Gridview_Output[e.ColumnIndex, e.RowIndex];
       if (cell.Value.ToString() != originalValue)
       {
           cell.Style.BackColor = Color.Red;
       }                
   }

如果您仍想检查OwningColumn.Name是否为特定值或任何其他检查,请在检查原始值后再添加if语句。

<强>更新

将细胞颜色更改回原始颜色应该完全按照Donbabbeo在评论中所描述的除非你正在处理一个非常大的DataGridView然后它会更有效率创建一个通用的单元格列表,以便在更改完成时添加到然后当保存时只通过List<>进行迭代以恢复。

它将被实现类似的东西。

首先,列表需要在

之外声明
List<DataGridViewCell> dgvc_List = new List<DataGridViewCell>();

一旦声明了列表,您就会在确定该值与原始值不同并且BackColor已更改后添加特定单元格。

在说CellEndEdit事件中的颜色变化之后会直接添加以下内容。

dgvc_List.Add(cell); 

随着每个确认的编辑,列表将继续增长,直到您准备好使用保存方法或其他任何您想要的方法,您可以调用以下内容

foreach (DataGridViewCell d in dgvc_List)
     {
         d.Style.BackColor = Color.White; // Or Any Color
     }
dgvc_List.Clear(); // Clears the list ready to go again

从长远来看,它的编码要多一些,但效率要高得多。