No nic, děkuji všem, kdo se s tou problematikou přepisování zabývali a nebo budou zabývat a třeba nám k tomu ještě něco řeknou. Vzhledem k tomu, že i na msdn jsem zaregistroval zmíňku o možnosti přepsání nějaké metody DataGridWiewu, přičemž z toho nedělali žádnou vědu, asi to fakt bude běžné. Trochu tuším, že se asi bude muset upravit kód designeru. Možná by šlo kód předělat tak, aby nadřazenou třídou byl DataGridView. A nebo vytvořit novou třídu, jejíž nadřazenou třídou bude DataGridView a místo instance DataGridView (kterou normálně vytváří designer) vytvořit instanci této naší nové třídy. Už to ale metodou pokus omyl zkoušet nebudu, jedna noc stačila a designer je fakt prevít, nenechá si (ani na zkoušku/pokusně) skoro na nic šáhnout. Dám sem tedy zatím jen řešení, které podle mého názoru velmi často bude vyhovovat a leckomu může pomoci. Stačí-li Vám obsloužit jednoduché CTRL+C, není nutné data vyzobávat ze selectu ručně, lze použít původní GetClipboardContent(), který jinak funguje poměrně pěkně, i na porůznu "rozházený" select.
Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
'DataGridView1.GetClipboardContent() naplní do oldData: HTML Format, Csv, UnicodeText, Text
If e.KeyCode = 67 And e.Control Then
Dim oldData As DataObject = DataGridView1.GetClipboardContent()
Dim newData As DataObject = New DataObject
If oldData IsNot Nothing Then
newData.SetData("Text", oldData.GetData("Text"))
newData.SetData("UnicodeText", oldData.GetData("UnicodeText"))
Clipboard.SetDataObject(newData)
End If
e.Handled = True
End If
End Sub
Pro úplné vyloučení natažení dat s nekorektní češtinou je dobré ještě toto. Jiné řešení mě nenapadá, snad jedině na nižší úrovni obsluhy klávesnice, pomocí třídy keyboard. Tohle ale funguje a vzhledem k poměrně atypickému portfoliu formátů dat, kterými GetClipboardContent() naplňuje Clipboard, myslím, že data ve schránce z ostatních programů nejsou ohrožena. Interval Timer1 může být nastaven na 1000, nebo i více.
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'V případě, že při CTRL+C zároveň probíhá editace buňky, interní DataGridView1.GetClipboardContent() naplní do Clipboardu: HTML Format, Csv, UnicodeText, Text
If Clipboard.ContainsData("HTML Format") And Clipboard.ContainsData("Csv") And Clipboard.ContainsData("UnicodeText") And Clipboard.ContainsData("Text") Then
Dim oldData As DataObject = Clipboard.GetDataObject
Dim newData As DataObject = New DataObject
If oldData IsNot Nothing Then
newData.SetData("Text", oldData.GetData("Text"))
newData.SetData("UnicodeText", oldData.GetData("UnicodeText"))
Clipboard.SetDataObject(newData)
End If
End If
End Sub
|