フォーマットされている場合でも、フォーマット済みセル値がセル値と等しくない

I am having DataGridView with column with this formatting property dataGridView1.Columns["RABAT"].DefaultCellStyle.Format = "0\\%";

そのため、セルにステップインして終了すると、 dataGridView1_CellValidating イベントが発生します。そのセルの古い値が新しい値と等しいかどうかをチェックする単純なチェックがあります。それがコードで続行されない場合は、次のようになります。

if (dataGridView1.SelectedCells[0].Value == e.FormattedValue)
    return;

現在の問題は、 dataGridView1.SelectedCells [0] .Value のフォーマットプロパティが原因で 10 が返されるが、 e.FormattedValue が返される 10%で、これら2つの値は同じではないため、このチェックに合格します。

e.FormattedValue から数字以外のものをすべて削除して比較することができます。この場合、この列には整数しかありませんが、今後のコードではどのようにフォーマットを削除できますか。 e.FormattedValue のスタイル

私はこのようにしましたが、私はたくさんの列があり、フォーマットを取り除くために毎回他の方法を作成したくないので一時的です。

switch (dataGridView1.Columns[e.ColumnIndex].Name)
{
    case "KOLICINA":

        if (dataGridView1.SelectedCells[0].Value == e.FormattedValue)
            return;

        dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value = e.FormattedValue;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOSTSAPOPUSTOM"].Value = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value) * Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENASAPOPUSTOM"].Value);
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOST"].Value = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value) * Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENA"].Value);
        PresaberiStavku(dataGridView1.Rows[e.RowIndex], false);
        break;
    case "RABAT":

        if (Convert.ToDouble(dataGridView1.SelectedCells[0].Value) == Convert.ToDouble(M.String.LeaveOnlyNumbers(e.FormattedValue.ToString())))
            return;

        double r = Convert.ToDouble(M.String.LeaveOnlyNumbers(e.FormattedValue.ToString()));
        double k = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["KOLICINA"].Value);
        double pc = Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENA"].Value);
        double pcsp = pc - (pc * r/100);
        double pvsp = pcsp * k;

        dataGridView1.Rows[e.RowIndex].Cells["RABAT"].Value = r;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNACENASAPOPUSTOM"].Value = pcsp;
        dataGridView1.Rows[e.RowIndex].Cells["PRODAJNAVREDNOSTSAPOPUSTOM"].Value = pvsp;

        PresaberiStavku(dataGridView1.Rows[e.RowIndex], false);
        break;
}
1

6 答え

書式設定されているセルにデータを入力するときは、次の点を考慮する必要があります。

  • The value of cell remains untouched and formatting is for display purpose.
  • When entering data in the cell you should enter data without any formatting, For example having 0% as Format, if you type 50% as value, it's not valid, but 50 is valid and will be shown as 50%.
  • When entering data, if you don't change anything in the cell, DataGridView.IsCurrentCellDirty returns false, otherwise it returns true.
  • e.FormattedValue always contains the text which is displaying in the cell.

上記の事実を知って、私はあなたがやろうとしていることを完了するのに十分な情報があると思います。

たとえば、セルが汚れていないことを知っていれば、戻ることができます。それ以外の場合は、 e.FormattedValue を列の ValueType に変換できるかどうかを確認する必要があります。セルが汚れてしまう場合は、 50%と入力すると無効なデータになります。

1
追加された
DataGridView.IsCurrentCellDirty に注目しましたか? if(dataGridView.IsCurrentCellDirty)return; と言うことができます。
追加された 著者 Reza Aghaei,
それは素晴らしいことです!どういたしまして :)
追加された 著者 Reza Aghaei,
私が値を入力して次の行/セルに移動するとき私の e.formattedvalue はフォーマットなしの通常の数ですが、私がセルを踏むとき(編集モードに入らないで)次のセルに移動イベントを発生させると、 e.formattedvalue はformatの値です。
追加された 著者 Aleksa Ristic,
Rezaありがとうございます。これで私の問題は解決しました。
追加された 著者 Aleksa Ristic,

書式設定されているセルにデータを入力するときは、次の点を考慮する必要があります。

  • The value of cell remains untouched and formatting is for display purpose.
  • When entering data in the cell you should enter data without any formatting, For example having 0% as Format, if you type 50% as value, it's not valid, but 50 is valid and will be shown as 50%.
  • When entering data, if you don't change anything in the cell, DataGridView.IsCurrentCellDirty returns false, otherwise it returns true.
  • e.FormattedValue always contains the text which is displaying in the cell.

上記の事実を知って、私はあなたがやろうとしていることを完了するのに十分な情報があると思います。

たとえば、セルが汚れていないことを知っていれば、戻ることができます。それ以外の場合は、 e.FormattedValue を列の ValueType に変換できるかどうかを確認する必要があります。セルが汚れてしまう場合は、 50%と入力すると無効なデータになります。

1
追加された
DataGridView.IsCurrentCellDirty に注目しましたか? if(dataGridView.IsCurrentCellDirty)return; と言うことができます。
追加された 著者 Reza Aghaei,
それは素晴らしいことです!どういたしまして :)
追加された 著者 Reza Aghaei,
私が値を入力して次の行/セルに移動するとき私の e.formattedvalue はフォーマットなしの通常の数ですが、私がセルを踏むとき(編集モードに入らないで)次のセルに移動イベントを発生させると、 e.formattedvalue はformatの値です。
追加された 著者 Aleksa Ristic,
Rezaありがとうございます。これで私の問題は解決しました。
追加された 著者 Aleksa Ristic,

書式設定されているセルにデータを入力するときは、次の点を考慮する必要があります。

  • The value of cell remains untouched and formatting is for display purpose.
  • When entering data in the cell you should enter data without any formatting, For example having 0% as Format, if you type 50% as value, it's not valid, but 50 is valid and will be shown as 50%.
  • When entering data, if you don't change anything in the cell, DataGridView.IsCurrentCellDirty returns false, otherwise it returns true.
  • e.FormattedValue always contains the text which is displaying in the cell.

上記の事実を知って、私はあなたがやろうとしていることを完了するのに十分な情報があると思います。

たとえば、セルが汚れていないことを知っていれば、戻ることができます。それ以外の場合は、 e.FormattedValue を列の ValueType に変換できるかどうかを確認する必要があります。セルが汚れてしまう場合は、 50%と入力すると無効なデータになります。

1
追加された
DataGridView.IsCurrentCellDirty に注目しましたか? if(dataGridView.IsCurrentCellDirty)return; と言うことができます。
追加された 著者 Reza Aghaei,
それは素晴らしいことです!どういたしまして :)
追加された 著者 Reza Aghaei,
私が値を入力して次の行/セルに移動するとき私の e.formattedvalue はフォーマットなしの通常の数ですが、私がセルを踏むとき(編集モードに入らないで)次のセルに移動イベントを発生させると、 e.formattedvalue はformatの値です。
追加された 著者 Aleksa Ristic,
Rezaありがとうございます。これで私の問題は解決しました。
追加された 著者 Aleksa Ristic,

e.FormattedValue decimal.Parse(e.FormattedValue.TrimEnd(new char [] {'%'、 ''}))に置き換えてみてください。ToString() dataGridView1.SelectedCells [0] .Value の最後に.ToString()を追加して、 dataGridView1.SelectedCells [0] .Value.ToString()のようにします。

The check should then read if (dataGridView1.SelectedCells[0].Value.ToString() == decimal.Parse(e.FormattedValue.TrimEnd(new char[] { '%', ' ' })).ToString())

0
追加された
私の質問の最後の文を読んでください。私はすでにそれを知っていますが、私のフォーマットスタイルが "0"の場合はどうなります
追加された 著者 Aleksa Ristic,

e.FormattedValue decimal.Parse(e.FormattedValue.TrimEnd(new char [] {'%'、 ''}))に置き換えてみてください。ToString() dataGridView1.SelectedCells [0] .Value の最後に.ToString()を追加して、 dataGridView1.SelectedCells [0] .Value.ToString()のようにします。

The check should then read if (dataGridView1.SelectedCells[0].Value.ToString() == decimal.Parse(e.FormattedValue.TrimEnd(new char[] { '%', ' ' })).ToString())

0
追加された
私の質問の最後の文を読んでください。私はすでにそれを知っていますが、私のフォーマットスタイルが "0"の場合はどうなります
追加された 著者 Aleksa Ristic,

e.FormattedValue decimal.Parse(e.FormattedValue.TrimEnd(new char [] {'%'、 ''}))に置き換えてみてください。ToString() dataGridView1.SelectedCells [0] .Value の最後に.ToString()を追加して、 dataGridView1.SelectedCells [0] .Value.ToString()のようにします。

The check should then read if (dataGridView1.SelectedCells[0].Value.ToString() == decimal.Parse(e.FormattedValue.TrimEnd(new char[] { '%', ' ' })).ToString())

0
追加された
私の質問の最後の文を読んでください。私はすでにそれを知っていますが、私のフォーマットスタイルが "0"の場合はどうなります
追加された 著者 Aleksa Ristic,