2016-12-15 48 views
0

我懇請您耐心的看完我的故事解決一個看似簡單的問題,射擊DataGridView的CellValueChanged事件立即做千位分隔符

我的主要目的是做千個分隔符在DataGridView中, 當我打字這意味着12345它變成12,345 與其他任務的區別在於當用戶輸入時不是當他或她離開單元格時執行此操作,

我無法在datagridview事件中找到任何方法,只要在單元格中添加數字,例如如果目的是在feeColumn中寫入12345,它必須被解僱五次,

許多研究後,我碰到這個代碼做的,但它也存在一些問題:

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_CurrentCellDirtyStateChanged並做commitEdit的它不再允許把任何數據單元格和刪除數據,而用戶改變其細胞

  2. 現在你想有數據,它成功地運行,甚至運行cellValueChanged一次我添加任何數字的費用列, 我的意思是1,那麼12然後123然後1234,然後12345 但依然有我的網格沒有逗號,當我打字,

我真的受夠了這個問題,任何幫助或任何其他解決方案,歡迎到我的朋友,

+0

你似乎將列的樣式格式設置爲單元格的實際值,即'column.DefaultCellStyle.Format =「123,456」'。 – stuartd

+1

如果您想在輸入時自動應用千位分隔符,請先用普通的'TextBox'嘗試。然後,如果成功,處理'DataGridView'的'EditingControlShowing'事件並獲取顯示爲編輯控件的'TextBox'並將邏輯應用於它。 –

+0

@stuartd Thx您的評論,是的,我正在這樣做,現在我得到了我做的一份愚蠢的工作,我可以請你與我分享你的想法嗎? – sariiia

回答

0

正如禮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事件類似,你嘗試過什麼in your other question.下面我給出我的實現,有一些調整,以選擇光標的位置更多相對於其之前的位置

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); 
    } 
}