2

DataGridViewにCurrencyTextBoxが必要です。インターネットを検索して、このソリューションを見つけます[^] しかし、これはdataGridView Cell Leaveイベントの場合に役立ちます。textchangeにコンマ区切り文字が必要です。ただし、この目的のためにこのソースを記述します。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            TextBox txt_edit = e.Control as TextBox;
            if (txt_edit != null)
            {

                txt_edit.TextChanged += new EventHandler(txt_edit_TextChanged);
            }
        }

        private void txt_edit_TextChanged(object sender, EventArgs e)
        {
            TextBox txt = (TextBox) sender;

            string str = txt.Text;
            str = str.Replace(",", "");
            int len = str.Length;
            if (len > 3)
            {
                str = str.Insert(len - 3, ",");
                len = len - 3;
                while (len > 3)
                {
                    str = str.Insert(len - 3, ",");
                    len = len - 3;
                }
            }

            dataGridView1.EndEdit();
            dataGridView1.CurrentRow.Cells[0].Value = str;
            dataGridView1.BeginEdit(false);
        }

プログラムを実行して番号を入力すると、このソースは最初の3桁で正しく機能し、このエラーをコード化する4番目の番号を入力するまで次のようになります。 ここに画像の説明を入力してください

なぜこのエラーコード?問題を解決するためのより良い方法はありますか?tnx

4

2 に答える 2

2

これを置き換えます:

dataGridView1.EndEdit();
dataGridView1.CurrentRow.Cells[0].Value = str;
dataGridView1.BeginEdit(false);

と:

int selStartFromEnd = txt.Text.Length - txt.SelectionStart;
txt.TextChanged -= txt_edit_TextChanged;
txt.Text = str;
txt.TextChanged += txt_edit_TextChanged;
if (txt.Text.Length - selStartFromEnd >= 0)
    txt.SelectionStart = txt.Text.Length - selStartFromEnd;
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
于 2012-08-17T13:57:07.543 に答える
1

これはうまくいくはずです....(100%確実ではありません)

delegate void SetColumnIndex(); 
private void txt_edit_TextChanged(object sender, EventArgs e) 
        { 

 //.....
  dataGridView1.EndEdit(); 

  SetColumnIndex method = new SetColumnIndex(Mymethod); 
  dataGridView1.CurrentRow.Cells[0].Value = str;
  dataGridView1..BeginInvoke(method);

         }         

 private void Mymethod()
        {
            dataGridView1.CurrentCell = myGridView.CurrentRow.Cells[0];
            dataGridView1.BeginEdit(false);
        }
于 2012-08-17T11:26:15.953 に答える