1

私はasをDataGridView持っています。ユーザーが 1 つの列に値を入力できるようにし、入力に応じて他の列の値を計算する方法を用意しました。BindingList<T>DataSource

メソッドをイベントに入れると、CellValueChanged編集したセルを離れると値が計算されます。

しかし、メソッドをCellValidatingイベントに入れると、次のセルを離れたときに値が計算されます。Enter キーを 2 回目に押したときにわかりやすくするためです。セルを編集した直後に別のコントロールに切り替えると、メソッドがまったく実行されません。

私はいくつかのテストを行いました。のメソッドの後にメッセージ ボックス付きの TryParse を追加しましたCellValidating。セルを離れようとするとすぐにメッセージ ボックスが表示されますが、次のセルを離れると計算が実行されます (2 回目の入力)。

なぜこうなった?これは何が原因ですか?

編集

flightDataGridView.DataSource = flight.Ships;
BindingList<Ship> _ships = new BindingList<Ship>();

_ships.Add(new Ship([some stuff here]));
.
.


public void UpdateCargoCapacity()
        {
            foreach (Ship ship in _ships)
            {
                ship.CargoCapacity = ship.SingleCargoCapacity * ship.Quantity;
            }
            flightDataGridView.Refresh();
        }

 

private void flightDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            flight.UpdateCargoCapacity();
            if (e.ColumnIndex == 1)
            {
                int i;
                if (!int.TryParse(Convert.ToString(e.FormattedValue), out i))
                {
                    e.Cancel = true;
                    MessageBox.Show("Incorrect input", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

        }
4

1 に答える 1

1

私はそれについて考えましたが、このように機能する理由は本当に単純です。がCellValidating起動されると、セルにはまだ古い値があります。その後、値が更新されます。次に、次のセルが検証されると、計算メソッドが再度実行され、前のセルの新しい値が計算に使用されます。

于 2013-06-16T11:38:48.890 に答える