作成日: 2018/11/02 最終更新日: 2019/02/07
文書種別
不具合
状況
修正済み
詳細
GcSpreadGridコントロールがデータソースに連結している場合、CellValueChanging/CellValueChangedイベントが2回発生する場合があります。
この現象は、連結するデータソースの種類によって、発生条件が異なります。
この現象は、連結するデータソースの種類によって、発生条件が異なります。
- DataTableの場合 任意のセルを選択し、非編集モードの状態でDeleteキーを押下した場合などに発生します。
- ObservableCollectionの場合 任意のセルを選択して、編集モードの状態にし、値を変更して編集を完了したときに発生します。
回避方法
Service Pack 2(v2.0.2019.0207)で修正済みです。
Service Pack 2(v2.0.2019.0207)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
Service Pack 2(v2.0.2019.0207)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
- DataTableの場合 Service Pack 1(v2.0.2018.0706)で修正済みです。
- ObservableCollectionの場合 以下のコードのように、変更内容をチェックして、2回目のイベント発生時の処理をスキップする方法をご検討ください。
◎サンプルコード(C#)
private void gcSpreadGrid1_CellValueChanged(object sender, GrapeCity.Windows.SpreadGrid.CellValueChangedEventArgs e)
{
if (IsDuplicateCellValueChangedEvent(e))
{
// 変更がない場合は、処理をスキップします。(2回目のイベント)
return;
}
// 通常の処理を行います。(1回目のイベント)
Console.WriteLine("CellValueChanged");
}
private GrapeCity.Windows.SpreadGrid.CellValueChangedEventArgs _lastValueChanged;
private bool IsDuplicateCellValueChangedEvent(GrapeCity.Windows.SpreadGrid.CellValueChangedEventArgs e)
{
GrapeCity.Windows.SpreadGrid.CellValueChangedEventArgs lastValueChanged = _lastValueChanged;
_lastValueChanged = e;
if (lastValueChanged == null)
{
return false;
}
// セルの位置およびセルの値について、変更の有無をチェックします。
return lastValueChanged.Column == e.Column &&
lastValueChanged.Row == e.Row &&
CompareObject(lastValueChanged.NewValue, e.NewValue) &&
CompareObject(lastValueChanged.OldValue, e.OldValue);
}
private static bool CompareObject(object left, object right)
{
if (left == right)
{
return true;
}
if (left == null)
{
return right.GetType() == typeof(object);
}
else if (right == null)
{
return left.GetType() == typeof(object);
}
if (left is IConvertible && right is IConvertible)
{
// 文字列に変換して、値をチェックします。
if (((IConvertible)left).ToString() == ((IConvertible)right).ToString())
{
return true;
}
}
return false;
}
旧文書番号
83366