[ETSH05665]仮想モードでセルをコピーしたとき、クリップボードに値がコピーされない
対象製品
El Tabelle Sheet 4.0J
発生環境
動作保証環境と同じ
詳細
仮想モード (Sheet.VirtualMode = True ) を使用しているとき、非編集状態でセルやセル範囲をコピーしてもクリップボードに値が格納されません。
このため、テキストエディタや Excel に値を貼り付けることができません。
このため、テキストエディタや Excel に値を貼り付けることができません。
回避方法
この現象は仮想モードの制限によるものです。Sheet では値のほかに罫線や背景などのクリップボード操作もサポートしているため、仮想モードではクリップボード操作自体が無効となります。この制限はドラッグ&ドロップでも同様です。
この制限を回避するには、値をクリップボードに格納する処理を作成します。このとき、Sheet.AllowClipboard プロパティは false に設定する必要があります。
[Visual Basic]
Private Sub Sheet1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Sheet1.KeyDown
Dim objSheet As GrapeCity.Win.ElTabelle.Sheet = _
CType(sender, GrapeCity.Win.ElTabelle.Sheet)
If e.KeyData = CType(Keys.Control Or Keys.C, Keys) Then
Dim copyData As String = ""
Dim objRanges() As GrapeCity.Win.ElTabelle.Range
objRanges = Sheet1.GetBlocks(GrapeCity.Win.ElTabelle.BlocksType.Selection)
Dim objRange As GrapeCity.Win.ElTabelle.Range = objRanges(0)
For j As Integer = objRange.TopRow To objRange.BottomRow
For i As Integer = objRange.LeftColumn To objRange.RightColumn
copyData = copyData & objSheet(i, j).Value
If Not i = objRange.RightColumn Then
copyData = copyData & vbTab
End If
Next
copyData = copyData & vbCrLf
Next
Clipboard.SetDataObject(copyData)
End If
End Sub
[C#]
private void sheet1_KeyDown(object sender, KeyEventArgs e)
{
GrapeCity.Win.ElTabelle.Sheet objSheet =
(GrapeCity.Win.ElTabelle.Sheet)sender;
if (e.KeyData == (Keys)(Keys.Control | Keys.C))
{
string copyData = "";
GrapeCity.Win.ElTabelle.Range[] objRanges = sheet1.GetBlocks(GrapeCity.Win.ElTabelle.BlocksType.Selection);
GrapeCity.Win.ElTabelle.Range objRange = objRanges[0];
for (int j = objRange.TopRow; j <= objRange.BottomRow; j++)
{
for (int i = objRange.LeftColumn; i <= objRange.RightColumn; i++)
{
copyData = copyData + (string)objSheet[i, j].Value;
if (i != objRange.RightColumn)
{
copyData = copyData + "¥t";
}
}
copyData = copyData + "¥r¥n";
}
Clipboard.SetDataObject(copyData);
}
}
この制限を回避するには、値をクリップボードに格納する処理を作成します。このとき、Sheet.AllowClipboard プロパティは false に設定する必要があります。
[Visual Basic]
Private Sub Sheet1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Sheet1.KeyDown
Dim objSheet As GrapeCity.Win.ElTabelle.Sheet = _
CType(sender, GrapeCity.Win.ElTabelle.Sheet)
If e.KeyData = CType(Keys.Control Or Keys.C, Keys) Then
Dim copyData As String = ""
Dim objRanges() As GrapeCity.Win.ElTabelle.Range
objRanges = Sheet1.GetBlocks(GrapeCity.Win.ElTabelle.BlocksType.Selection)
Dim objRange As GrapeCity.Win.ElTabelle.Range = objRanges(0)
For j As Integer = objRange.TopRow To objRange.BottomRow
For i As Integer = objRange.LeftColumn To objRange.RightColumn
copyData = copyData & objSheet(i, j).Value
If Not i = objRange.RightColumn Then
copyData = copyData & vbTab
End If
Next
copyData = copyData & vbCrLf
Next
Clipboard.SetDataObject(copyData)
End If
End Sub
[C#]
private void sheet1_KeyDown(object sender, KeyEventArgs e)
{
GrapeCity.Win.ElTabelle.Sheet objSheet =
(GrapeCity.Win.ElTabelle.Sheet)sender;
if (e.KeyData == (Keys)(Keys.Control | Keys.C))
{
string copyData = "";
GrapeCity.Win.ElTabelle.Range[] objRanges = sheet1.GetBlocks(GrapeCity.Win.ElTabelle.BlocksType.Selection);
GrapeCity.Win.ElTabelle.Range objRange = objRanges[0];
for (int j = objRange.TopRow; j <= objRange.BottomRow; j++)
{
for (int i = objRange.LeftColumn; i <= objRange.RightColumn; i++)
{
copyData = copyData + (string)objSheet[i, j].Value;
if (i != objRange.RightColumn)
{
copyData = copyData + "¥t";
}
}
copyData = copyData + "¥r¥n";
}
Clipboard.SetDataObject(copyData);
}
}
この文書は、以前は次のFAQ IDで公開されていました : 6374