当使用DataError事件时,如何获得要解析的e.Context

本文关键字:Context 何获得 DataError 事件 | 更新日期: 2023-09-27 18:28:26

我目前有一个数据网格视图,用户可以使用它来输入数据。为了捕捉不正确的格式,我搜索并读取了事件DataError。我发现的几个样本似乎都认为e.Context有一个像这样的DataGridViewDataErrorContext

if (e.Context == DataGridViewDataErrorContexts.Commit)    
{    
    MessageBox.Show("Commit error");    
}

但是,当我尝试在测试网格上实现相同的东西时,我得到了以下e.Context。它有一个这样的列表:Parsing | Commit | CurrentCellChange

e.Context 屏幕截图

请注意,e.Context的值是一个值列表,而不是像在线示例代码那样的单个值。我是做错了什么还是错过了一步?如何将其分开?

我正在使用VS 2010教授

提前感谢!

当使用DataError事件时,如何获得要解析的e.Context

不确定它是正确的路径,但我最终对它进行了轻微修改以使其正常工作。

    //if (e.Context == DataGridViewDataErrorContexts.Commit)
    if (e.Context.ToString().Contains(DataGridViewDataErrorContexts.Commit.ToString()))
    {
              MessageBox.Show("Commit error");
    }
    //if (e.Context == DataGridViewDataErrorContexts.CurrentCellChange)
    if (e.Context.ToString().Contains(DataGridViewDataErrorContexts.CurrentCellChange.ToString()))
    {
              MessageBox.Show("Cell change");
    }
    //if (e.Context == DataGridViewDataErrorContexts.Parsing)
    if (e.Context.ToString().Contains(DataGridViewDataErrorContexts.Parsing.ToString()))
    {
              MessageBox.Show("Parsing error");
    }
    //if (e.Context == DataGridViewDataErrorContexts.LeaveControl)
    if (e.Context.ToString().Contains(DataGridViewDataErrorContexts.LeaveControl.ToString()))
    {
              MessageBox.Show("Leave control error");
    }

这允许我检查e.Context 中的内容

对于.NET Framework 4,我认为首选的方法是使用Enum.HasFlag方法。当然,这应该与用[Flags]属性标记的枚举类型一起使用(DataGridViewDataErrorContexts就是其中之一)。

我最近刚刚写了一个小助手方法,你可能会发现它很有用:

private string ReadableDataGridViewContext(DataGridViewDataErrorContexts context)
{
    var translations = new Dictionary<DataGridViewDataErrorContexts, string> {
        { DataGridViewDataErrorContexts.ClipboardContent, "Copying Data to the Clipboard" },
        { DataGridViewDataErrorContexts.Commit, "Committing Data" },
        { DataGridViewDataErrorContexts.CurrentCellChange, "Moving Focus to a different Cell, due to error in the Cell being left" },
        { DataGridViewDataErrorContexts.Display, "Displaying Data in a Cell" },
        { DataGridViewDataErrorContexts.Formatting, "Formatting Data" },
        { DataGridViewDataErrorContexts.InitialValueRestoration, "Restoring Cell Data" },
        { DataGridViewDataErrorContexts.LeaveControl, "Leaving the Grid" },
        { DataGridViewDataErrorContexts.Parsing, "Parsing Data" },
        { DataGridViewDataErrorContexts.PreferredSize, "Calculating the preferred size for a Cell" },
        { DataGridViewDataErrorContexts.RowDeletion, "Deleting a Row" },
        { DataGridViewDataErrorContexts.Scroll, "Scrolling over the Grid" }
    };
    var list = (from contextFlag in translations.Keys
                    where context.HasFlag(contextFlag)
                    select translations[contextFlag]).ToList();
    return String.Join(",", list);
}