[FlexGrid for WinForms] DataTypeが「double」の列に負の数が設定されているとき、「-」を入力しても無視される

文書番号 : 81985     文書種別 : 既知の問題     登録日 : 2017/02/16     最終更新日 : 2017/05/17
文書を印刷する
対象製品
ComponentOne for WinForms
ステータス
修正済み
詳細
C1FlexGridで、列のDataType = typeof(double)を設定している場合、既存の負数を、さらに負数で上書きしようとして「-」を入力すると、数字全体が選択状態になります。続いて数値を入力すると、「-」のつかない正の数として表示されます。
回避方法
この問題はバージョン4.0.20171.260で修正されました。
※ .NET Framework 2.0用アセンブリはメンテナンスモードに移行したため、C1.Win.C1xxxx.2.dllでの修正は行われません。
  .NET Framework 4.0用アセンブリ(C1.Win.C1xxxx.4.dll)をご利用ください。

修正版の適用方法については、アップデートの方法を参照してください。

修正版を適用しない場合の回避方法は、次の通りです。

KeyDown、StartEdit、KeyDownEditイベントを使用して、入力されたキーが「-」キーかどうかを判定し、正しく処理するコードを追加します。

◎サンプルコード(VB)
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    InitializeMainFg()
  End Sub

  Private Sub InitializeMainFg()
    Me.MainC1FlexGrid.Styles.Add("st")
    MainC1FlexGrid.Styles("st").BackColor = System.Drawing.Color.White
    MainC1FlexGrid.Styles("st").DataType = GetType(Double)
    MainC1FlexGrid.Styles("st").TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightCenter
    'MainC1FlexGrid.Styles["st"].Format = "#,##0.00";

    MainC1FlexGrid.Cols(0).Style = MainC1FlexGrid.Styles("st")
    MainC1FlexGrid.Cols(1).Style = MainC1FlexGrid.Styles("st")
    MainC1FlexGrid.Cols(2).Style = MainC1FlexGrid.Styles("st")
  End Sub

  Dim isMinusKey As Boolean = False
  Dim oldValue As System.Nullable(Of Double) = Nothing

  Private Sub MainC1FlexGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles MainC1FlexGrid.KeyDown
    isMinusKey = False
    If e.KeyCode = Keys.OemMinus Or e.KeyCode = Keys.Subtract Then
      isMinusKey = True
    End If
  End Sub

  Private Sub MainC1FlexGrid_StartEdit(sender As Object, e As C1.Win.C1FlexGrid.RowColEventArgs) Handles MainC1FlexGrid.StartEdit
    Dim value = MainC1FlexGrid(e.Row, e.Col)
    If TypeOf value Is Double AndAlso CDbl(value) < 0 AndAlso isMinusKey Then
      isMinusKey = False
      oldValue = CDbl(value)
      MainC1FlexGrid(e.Row, e.Col) = ""
    End If
  End Sub

  Private Sub MainC1FlexGrid_KeyDownEdit(sender As Object, e As C1.Win.C1FlexGrid.KeyEditEventArgs) Handles MainC1FlexGrid.KeyDownEdit
    If e.KeyCode = Keys.Escape AndAlso oldValue.HasValue Then
      MainC1FlexGrid(e.Row, e.Col) = oldValue.Value
      oldValue = Nothing
    End If
  End Sub

◎サンプルコード(C#)
  public partial class MainForm : Form
  {
    private bool isKeyDown;

    public MainForm()
    {
      InitializeComponent();
      InitializeMainFg();
    }

    private void InitializeMainFg()
    {
      this.MainC1FlexGrid.Styles.Add("st");
      MainC1FlexGrid.Styles["st"].BackColor = System.Drawing.Color.White;
      MainC1FlexGrid.Styles["st"].DataType = typeof(double);
      MainC1FlexGrid.Styles["st"].TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightCenter;
      //MainC1FlexGrid.Styles["st"].Format = "#,##0.00";

      MainC1FlexGrid.Cols[0].Style = MainC1FlexGrid.Styles["st"];
      MainC1FlexGrid.Cols[1].Style = MainC1FlexGrid.Styles["st"];
      MainC1FlexGrid.Cols[2].Style = MainC1FlexGrid.Styles["st"];
    }

    bool isMinusKey = false;
    double? oldValue = null;
    private void MainC1FlexGrid_KeyDown(object sender, KeyEventArgs e)
    {
      isMinusKey = false;
      if (e.KeyCode == Keys.OemMinus | e.KeyCode == Keys.Subtract)
        isMinusKey = true;
    }

    private void MainC1FlexGrid_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
    {
      var value = MainC1FlexGrid[e.Row, e.Col];
      if (value is double && (double)value < 0 && isMinusKey)
      {
        isMinusKey = false;
        oldValue = (double)value;
        MainC1FlexGrid[e.Row, e.Col] = "";
      }
    }

    private void MainC1FlexGrid_KeyDownEdit(object sender, C1.Win.C1FlexGrid.KeyEditEventArgs e)
    {
      if(e.KeyCode == Keys.Escape && oldValue.HasValue)
      {
        MainC1FlexGrid[e.Row, e.Col] = oldValue.Value;
        oldValue = null;
      }
    }
  }