2012-03-10 153 views
2

我有一個Windows窗體VS2010 .NET 4項目,標準DataGridView綁定到窗體上的數據源。DataGridView編輯WinForms上的單元格

網格有一個文本列,我想成爲一個點,並在點擊的字符上進行編輯。 當你點擊你想調整的角色時,就像普通的文本框/編輯器一樣。如果可能的話,我還想使用UP/DOWN鍵在行之間移動,但希望光標移動到同一列中的相同字符位置,而不選擇整個文本。

我已經嘗試了幾件事情:

DataGridView1.ClearSelection()

DataGridView1.BeginEdit(假)

的BeginEdit只是把光標停留在文本的末尾,這意味着另一點擊指向字符位置進行編輯。

我知道一個類似DevExpress的商業網格默認爲編輯,只需點擊一下鼠標就可以點擊正確的字符位置,但顯然需要花錢。

我試圖在DataGridView1_EditingControlShowing事件

If TypeOf e.Control Is System.Windows.Forms.DataGridViewTextBoxEditingControl Then 
     Dim tb As TextBox = e.Control 
     tb.SelectionStart = 5 
     tb.SelectionLength = 5 
End If 

但這沒什麼。

我只是想刪除兩個或三個點擊以獲得需要調整的角色位置。

我還沒有看過自定義數據列。

任何建議將不勝感激。

回答

2

沒有好的開箱即用的方式。最接近的是將網格的EditMode設置爲EditOnEnter,但這意味着您只需要兩次點擊,而不是三次。

您需要編寫自己的列類型。

有人已經做到了here

我還沒有檢查過,如果該示例處理向上和向下 - 如果它不是,那麼你在SelectionStart和SelectionLength屬性的正確軌道上,只需抓住你要離開的單元格的符號位置並應用它到新的小區。


事實證明,設置這些屬性是有點更多地參與,我想起了(可能是因爲我已經使用MaskedTextBox中的自定義字段類型我最後一次這樣做)。

下面的代碼(在c#中,但原理適用於vb.Net,如果你不能自己轉換它,我可以給vb代碼)很高興地工作 - 可以通過將它放入自定義控件來整理,但我「會離開,作爲一個練習:)

首先,我添加的處理程序EditingControlShowing事件:

void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl; 
    current_control = t; 
    t.Leave += new EventHandler(t_Leave); 
} 

在上面current_control方法是這樣的形式級私有變量。t的事件處理程序如下所示:

void t_Leave(object sender, EventArgs e) 
{ 
    cell_caret_pos = current_control.SelectionStart; 
} 

還有,我們有一個類級別的專用字段 - cell_caret_pos。

然後我發現的是,設置SelectionStart和SelectionLength你需要的CellEnter事件處理程序中工作:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) 
{ 
    dataGridView1.BeginEdit(false); 
    DataGridViewTextBoxEditingControl editControl = 
     (DataGridViewTextBoxEditingControl)dataGridView1.EditingControl; 

    if (cell_caret_pos != 0) 
    { 
     editControl.SelectionStart = cell_caret_pos; 
     editControl.SelectionLength = 0; 
    } 
} 
+0

出色答卷做的主要工作位,我一直在爲這個搜索了好半天。它不會完成上行,但我可能會修改它。關於獲取前一個單元格的任何想法。 – 2012-03-11 12:28:42

+0

我只是通過將編輯控件(來自編輯控件顯示)放置在表單級別的專用變量中,然後在編輯控件離開事件期間將SelectionStart值放置在表單級別的int變量中,從而非常迅速地對此進行了驗證。然後,一旦在網格外面,我檢查了整數,它有最後一個編輯控制位置。只花了我一分鐘的時間來測試,這樣你就可以很容易地將類似的東西放入該示例的子類dgv中。 – 2012-03-11 12:41:39

+0

謝謝大衛,我有插入位置,但是當使用上/下箭頭時,它不會進入下一行的編輯模式,我不知道如何設置編輯,然後重新定位插入符號。我嘗試將EditMode設置爲EditOnEnter,但這樣可以防止鼠標單擊編輯。對不起,這是一個新手... – 2012-03-11 14:23:01

相關問題