0

一見単純な問題を解決するための私の話を辛抱強く読んでください。

私の主な目的は、データグリッドビューで桁区切りを行うことです。つまり、12345 と入力すると 12,345 になります。他のタスクとの違いは、ユーザーがセルを離れるときではなく、入力しているときにこれを行うことです。

セルに数字を追加するたびに発生する datagridview イベントのメソッドを見つけることができませんでした。

多くの調査の後、私はこのコードに出くわしましたが、いくつかの問題があります:

myGrid:

ItemName  Quantity  FeeColumn


Private void grdTrading_CurrentCellDirtyStateChanged(object sender, System.EventArgs e) 
{
    If (grdTrading.IsCurrentCellDirty )
    {
        grdTrading.CommitEdit(DataGridViewDataErrorContexts.Commit)

    }
}

Private void grdTrading_CellValueChanged(object sender , System.Windows.FormsDataGridViewCellEventArgs e)
{
   grdTrading.Columns[ColumnFee.Name].DefaultCellStyle.Format=(Decimal.Parse(grdTrading.Rows[0].Cells[ColumnFee.Name].Value.Tostring())).Tostring("#,##0")
}

今何が悪いのですか?

  1. 最初に行ってgrdTrading_CurrentCellDirtyStateChangedcommitedit を実行すると、ユーザーがセルを変更している間、セルにデータを入れてデータを削除することはできなくなります

  2. データがあり、正常に実行cellValueChangedされ、料金の列に任意の数字を追加すると実行されます。つまり、1、12、123、1234、12345 ですが、入力時にグリッドにコンマがありません。

私は本当にこの問題にうんざりしています.どんな助けや他の解決策も歓迎します.

4

1 に答える 1

0

Reza Aghaei が正しく指摘したように、ここでのアイデアはDataGridView.EditingControlShowingイベントを処理することです。コントロールで練習するという彼のアドバイスTextBoxは的を射ており、コメントのリンクから一般的に考えていることがわかります。今すぐすべてを接続する必要があります。

this.dataGridView1.EditingControlShowing += this.DataGridView1_EditingControlShowing;

private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (e.Control is TextBox)
    {
        TextBox tb = e.Control as TextBox;
        tb.TextChanged -= Tb_TextChanged;
        tb.TextChanged += Tb_TextChanged;
    }
}

これで、他の質問でTextBox.TextChanged試したのと同じようにイベントを処理できます。以下に、選択カーソルの位置を以前の位置よりも相対的に調整して、私の実装を示しました。

private void Tb_TextChanged(object sender, EventArgs e)
{
    TextBox tb = sender as TextBox;
    ulong value;
    string text = tb.Text.Replace(",", "");
    string old = tb.Text;

    if (ulong.TryParse(text, out value))
    {
        int start = tb.SelectionStart;
        tb.Text = string.Format("{0:n0}", value);
        tb.SelectionStart = Math.Max(0, start + tb.Text.Length - old.Length);

        if (tb.SelectionStart > 0 && tb.Text[tb.SelectionStart - 1] == ',')
        {
            tb.SelectionStart--;
        }
    }
}

お役に立てれば。


補足: これがユーザーを悩ませている場合 (ライブ編集中にユーザー入力を変更することは、通常の予想される動作ではないため、まったくもっともらしいことです)、元に戻すのは簡単です:

private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    ulong value;

    if (ulong.TryParse(e.Value?.ToString(), out value))
    {
        e.Value = string.Format("{0:n0}", value);
    }
}
于 2016-12-16T19:39:38.197 に答える