C# 阻止datagridview的事件运行

C# 阻止datagridview的事件运行,c#,datagridview,C#,Datagridview,我有一个datagridview,其代码如下: private void datagridview_CustomerList_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (!_continueCellEdit) { _continueCellEdit = true; return; } if

我有一个datagridview,其代码如下:

    private void datagridview_CustomerList_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (!_continueCellEdit)
        {
            _continueCellEdit = true;
            return;
        }

        if (datagridview_CustomerList.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == ColumnNames.NewRateColumn.ToString())
        {
            var row = datagridview_CustomerList.Rows[e.RowIndex];
            var font = datagridview_CustomerList.Font;

            if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.NewRateColumn.ToString()].Value) > 0)
            {
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Regular);
                if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.BudgetBalanceColumn.ToString()].Value) > 0)
                    row.DefaultCellStyle.BackColor = color_BudgetCustomers;
                else
                    row.DefaultCellStyle.BackColor = color_OriginalColor;
            }
            else
            {
                row.DefaultCellStyle.BackColor = color_ZeroCharge;
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Strikeout);
            }
        }

    }

    private void datagridview_CustomerList_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        _continueCellEdit = false;
        PaintRow(datagridview_CustomerList.Rows[e.RowIndex]);
    }
我正在使用_continueCellEdit阻止CellEndEdit事件运行。我可以使用此选项禁用/启用事件:

datagridview_CustomerList.CellEndEdit += datagridview_CustomerList_CellEndEdit;
这没用,因为我没有地方放在上面。如果我把它放在datagridview\u CustomerList\u CellMouseDoubleClick中,它仍然会在该事件完成后运行

我可能想得太多了,因为我没时间吃午饭,我得怪什么,但是

有没有更好的方法来处理这个问题而不是使用bool

谢谢

您可以使用该模式,但老实说,我认为您的用例不能保证它,bool解决方案也很好

也就是说它可以像这样实现

链中的第一个处理程序基本上看起来像

 public DoubliClickHanlder : IChain
 {
    public IChain NextHandler(get;set;)

 public void ProcessEvent(object sender, DataGridViewCellEventArgs e)
    {
      if !(this.continueCellEdit && this.NextHandler!= null)
          NextHandler.ProcessEvent(sender,e) 
    }

 }
public GridColorSetter : IChain
{
 public IChain NextHandler(get;set;)
public void ProcessEvent(object sender, DataGridViewCellEventArgs e)
{
       if (datagridview_CustomerList.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == ColumnNames.NewRateColumn.ToString())
        {
            var row = datagridview_CustomerList.Rows[e.RowIndex];
            var font = datagridview_CustomerList.Font;

            if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.NewRateColumn.ToString()].Value) > 0)
            {
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Regular);
                if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.BudgetBalanceColumn.ToString()].Value) > 0)
                    row.DefaultCellStyle.BackColor = color_BudgetCustomers;
                else
                    row.DefaultCellStyle.BackColor = color_OriginalColor;
            }
            else
            {
                row.DefaultCellStyle.BackColor = color_ZeroCharge;
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Strikeout);
            }
        }

    if (this.NextHandler!= null)
      this.NextHandler.ProcessEvent;

 }
}
}
第二个处理器看起来像

 public DoubliClickHanlder : IChain
 {
    public IChain NextHandler(get;set;)

 public void ProcessEvent(object sender, DataGridViewCellEventArgs e)
    {
      if !(this.continueCellEdit && this.NextHandler!= null)
          NextHandler.ProcessEvent(sender,e) 
    }

 }
public GridColorSetter : IChain
{
 public IChain NextHandler(get;set;)
public void ProcessEvent(object sender, DataGridViewCellEventArgs e)
{
       if (datagridview_CustomerList.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == ColumnNames.NewRateColumn.ToString())
        {
            var row = datagridview_CustomerList.Rows[e.RowIndex];
            var font = datagridview_CustomerList.Font;

            if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.NewRateColumn.ToString()].Value) > 0)
            {
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Regular);
                if (modMain.SSS_ToDecimal(row.Cells[ColumnNames.BudgetBalanceColumn.ToString()].Value) > 0)
                    row.DefaultCellStyle.BackColor = color_BudgetCustomers;
                else
                    row.DefaultCellStyle.BackColor = color_OriginalColor;
            }
            else
            {
                row.DefaultCellStyle.BackColor = color_ZeroCharge;
                row.DefaultCellStyle.Font = new Font(font, FontStyle.Strikeout);
            }
        }

    if (this.NextHandler!= null)
      this.NextHandler.ProcessEvent;

 }
}
}
然后你可以写下

DoubleClickHandler dch = new DoubleClickHandler () {NextHandler= new GridColorSetter()}
this.datagridview_CustomerList.CellEndEdit += dch.ProcessEvent;

哈哈,是的,我想我还是用布尔值吧。谢谢你的建议。这确实给了我一些其他问题的想法。