ダブルクォーテーションが含まれる文字列を正しく貼り付けられない
対象製品
SPREAD for WPF 1.0J
状況
修正済み
詳細
ダブルクォーテーションが含まれる文字列をクリップボードから貼り付けると、正しい値で貼り付けられません。クリアされるべきダブルクォーテーションダがそのまま貼り付けられたり、改行位置が不正になるという動作になります。
【例】
「"AA」という文字列は「"AA」と貼り付けられます。正しくは「AA」です。
「A"B(改行)C」という文字は、一つのセル内に貼り付けられます。正しくは二つのセルに「A"B」と「C」という文字が貼り付けられます。
【例】
回避方法
Service Pack 3(v1.0.2016.1207)で修正済みです。
Service Pack 3(v1.0.2016.1207)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
CsvHelperを使用して回避可能です。
◎サンプルコード(VB)
◎サンプルコード(C#)
Service Pack 3(v1.0.2016.1207)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
CsvHelperを使用して回避可能です。
- Visual Studioの「プロジェクト」メニューから「NuGetパッケージの管理」を選択します。
- [CsvHelper]を検索し、インストールします。
- SPREADコントロールのClipboardPastingイベントを次のように実装します。
◎サンプルコード(VB)
Private Sub GcSpreadGrid1_ClipboardPasting(sender As Object, e As ClipboardPastingEventArgs) Handles GcSpreadGrid1.ClipboardPasting
' SPREADからSPREADへのコピー&ペーストでは、既定動作を適用します。
If Clipboard.ContainsData("SpreadGridXml") Or Clipboard.ContainsData("SpreadGridNative") Then
Return
End If
' 他のアプリケーションからのペースト時の回避コードです。
e.Handled = True
Dim Text = Clipboard.GetText()
Dim rowCount = 0
Dim colCount = 0
Using textWriter As New StringWriter
Using csvWriter As New CsvHelper.CsvWriter(textWriter)
Using textReader As New StringReader(Text)
Using csvParser As New CsvHelper.CsvParser(textReader)
' TSVフォーマットを使用します。
csvParser.Configuration.Delimiter = "¥t"
csvWriter.Configuration.Delimiter = "¥t"
csvWriter.Configuration.QuoteAllFields = True
' ParserからWriterへコピーします。
While True
Dim row = csvParser.Read()
If row Is Nothing Then
Exit While
End If
rowCount += 1
colCount = Math.Max(colCount, row.Length)
For Each item In row
csvWriter.WriteField(item)
Next
csvWriter.NextRecord()
End While
Text = textWriter.ToString()
End Using
End Using
End Using
End Using
' 文字列をSPREADコントロールに設定します。
GcSpreadGrid1.SetClip(e.CellRange.Row, e.CellRange.Column, rowCount, colCount, Text)
End Sub
◎サンプルコード(C#)
void gcSpreadGrid1_ClipboardPasting(object sender, ClipboardPastingEventArgs e)
{
if (Clipboard.ContainsData("SpreadGridXml") || Clipboard.ContainsData("SpreadGridNative"))
{
// SPREADからSPREADへのコピー&ペーストでは、既定動作を適用します。
return;
}
// 他のアプリケーションからのペースト時の回避コードです。
e.Handled = true;
var text = Clipboard.GetText();
var rowCount = 0;
var colCount = 0;
using (var textWriter = new StringWriter())
using (var csvWriter = new CsvWriter(textWriter))
using (var textReader = new StringReader(text))
using (var csvParser = new CsvParser(textReader))
{
// TSVフォーマットを使用します。
csvParser.Configuration.Delimiter = "¥t";
csvWriter.Configuration.Delimiter = "¥t";
csvWriter.Configuration.QuoteAllFields = true;
// ParserからWriterへコピーします。
while (true)
{
var row = csvParser.Read();
if (row == null)
{
break;
}
rowCount++;
colCount = Math.Max(colCount, row.Length);
foreach (var item in row)
{
csvWriter.WriteField(item);
}
csvWriter.NextRecord();
}
text = textWriter.ToString();
}
// 文字列をSPREADコントロールに設定します。
this.gcSpreadGrid1.SetClip(e.CellRange.Row, e.CellRange.Column, rowCount, colCount, text);
}