作成日: 2018/06/22 最終更新日: 2018/12/18
文書種別
不具合
状況
修正済み
詳細
GcTextBox型セルについて、MultiLineプロパティをTrue、MaxLineCountプロパティに2以上の値を設定した時、以下の問題が発生します。
事象1:編集内容が破棄される場合がある
セルを編集状態にし、テキストの最後に改行を入力して、Enterキーを押すと編集内容が破棄されます。(編集前の状態に戻ります。)
なお、この事象は入力された行数(改行だけの行を含む)がMaxLineCountプロパティの値より少ない場合に発生します。
■問題発生イメージ

事象2:不要な改行が設定される
コード上からセルのTextプロパティに、最後が改行コードで終わる文字列を設定すると、不要な改行が設定されます。(MaxLineCountプロパティと同じ行数になるように改行が追加されます。)
なお、この事象は、MaxLineCountプロパティの設定と、設定しようとする文字列の内容によっては、SheetViewクラスのSetTextメソッドを使用した時にも発生します。
■サンプルコード(VB.NET)
事象3:例外が発生する
コード上からSheetViewクラスのSetValueメソッドを使用して、最後が改行コードの文字列を設定しようとすると、以下の例外が発生します。
----------------------------------------------------
System.ArgumentException: 無効な値が指定されました
----------------------------------------------------
なお、この事象は、MaxLineCountプロパティの設定と、設定しようとする文字列の内容によっては、SheetViewクラスのSetTextメソッドを使用した時にも発生します。
事象1:編集内容が破棄される場合がある
セルを編集状態にし、テキストの最後に改行を入力して、Enterキーを押すと編集内容が破棄されます。(編集前の状態に戻ります。)
なお、この事象は入力された行数(改行だけの行を含む)がMaxLineCountプロパティの値より少ない場合に発生します。
■問題発生イメージ

事象2:不要な改行が設定される
コード上からセルのTextプロパティに、最後が改行コードで終わる文字列を設定すると、不要な改行が設定されます。(MaxLineCountプロパティと同じ行数になるように改行が追加されます。)
なお、この事象は、MaxLineCountプロパティの設定と、設定しようとする文字列の内容によっては、SheetViewクラスのSetTextメソッドを使用した時にも発生します。
■サンプルコード(VB.NET)
Me.FpSpread1.ActiveSheet.Cells(0, 0).Text = "test" & System.Environment.NewLine
Me.FpSpread1.ActiveSheet.SetText(0, 1, "test" & System.Environment.NewLine)
Me.FpSpread1.ActiveSheet.SetText(0, 1, "test" & System.Environment.NewLine)
事象3:例外が発生する
コード上からSheetViewクラスのSetValueメソッドを使用して、最後が改行コードの文字列を設定しようとすると、以下の例外が発生します。
----------------------------------------------------
System.ArgumentException: 無効な値が指定されました
----------------------------------------------------
なお、この事象は、MaxLineCountプロパティの設定と、設定しようとする文字列の内容によっては、SheetViewクラスのSetTextメソッドを使用した時にも発生します。
回避方法
Service Pack 2(v11.0.4503.2012)で修正済み。
Service Pack 2を適用せずに対処する方法としては、GcTextBoxCellTypeクラスを継承したカスタムセルを作成し、内部のチェック・変換処理を変更した上で使用する方法が考えられます。以下のコードをご参考ください。
■サンプルコード(VB.NET)
■サンプルコード(C#)
Service Pack 2を適用せずに対処する方法としては、GcTextBoxCellTypeクラスを継承したカスタムセルを作成し、内部のチェック・変換処理を変更した上で使用する方法が考えられます。以下のコードをご参考ください。
■サンプルコード(VB.NET)
' カスタムセルクラスの定義
Class MyGcTextBoxCellType
Inherits GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
Public Overrides Function IsValid(value As Object) As Boolean
Dim textVal As String = value
If Not String.IsNullOrEmpty(textVal) Then
While (textVal.EndsWith(Environment.NewLine, StringComparison.OrdinalIgnoreCase))
textVal = textVal.Substring(0, textVal.Length - Environment.NewLine.Length)
End While
End If
Return MyBase.IsValid(textVal)
End Function
Public Overrides Function Parse(s As String) As Object
Dim textVal As String = s
Dim originalLines() As String = GetLines(textVal)
Dim parsedText As String = CType(MyBase.Parse(textVal), String)
Dim parsedLines() As String = GetLines(parsedText)
If (originalLines.Length = parsedLines.Length) Then
Return parsedText
Else
Dim stringBuilder As New System.Text.StringBuilder()
Dim length As Integer = originalLines.Length
Dim i As Integer = 0
Do While (i < length)
If (i <> 0) Then stringBuilder.AppendLine()
stringBuilder.Append(parsedLines(i))
i += 1
Loop
Return stringBuilder.ToString
End If
End Function
Private Function GetLines(text As String) As String()
Dim result As List(Of String) = New List(Of String)
Dim lines() As String = text.Split(New String() {Environment.NewLine}, Int32.MaxValue, StringSplitOptions.None)
result.AddRange(lines)
Return result.ToArray()
End Function
End Class
Class MyGcTextBoxCellType
Inherits GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
Public Overrides Function IsValid(value As Object) As Boolean
Dim textVal As String = value
If Not String.IsNullOrEmpty(textVal) Then
While (textVal.EndsWith(Environment.NewLine, StringComparison.OrdinalIgnoreCase))
textVal = textVal.Substring(0, textVal.Length - Environment.NewLine.Length)
End While
End If
Return MyBase.IsValid(textVal)
End Function
Public Overrides Function Parse(s As String) As Object
Dim textVal As String = s
Dim originalLines() As String = GetLines(textVal)
Dim parsedText As String = CType(MyBase.Parse(textVal), String)
Dim parsedLines() As String = GetLines(parsedText)
If (originalLines.Length = parsedLines.Length) Then
Return parsedText
Else
Dim stringBuilder As New System.Text.StringBuilder()
Dim length As Integer = originalLines.Length
Dim i As Integer = 0
Do While (i < length)
If (i <> 0) Then stringBuilder.AppendLine()
stringBuilder.Append(parsedLines(i))
i += 1
Loop
Return stringBuilder.ToString
End If
End Function
Private Function GetLines(text As String) As String()
Dim result As List(Of String) = New List(Of String)
Dim lines() As String = text.Split(New String() {Environment.NewLine}, Int32.MaxValue, StringSplitOptions.None)
result.AddRange(lines)
Return result.ToArray()
End Function
End Class
' ※セル型を定義・設定している箇所
' GcTextBoxCellTypeクラスではなく、カスタムセルを使用します。
'Dim textCell As New GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
Dim textCell As New MyGcTextBoxCellType()
textCell.MaxLineCount = 4
textCell.Multiline = True
Me.FpSpread1.ActiveSheet.Columns(0).CellType = textCell
' GcTextBoxCellTypeクラスではなく、カスタムセルを使用します。
'Dim textCell As New GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
Dim textCell As New MyGcTextBoxCellType()
textCell.MaxLineCount = 4
textCell.Multiline = True
Me.FpSpread1.ActiveSheet.Columns(0).CellType = textCell
■サンプルコード(C#)
// カスタムセルクラスの定義
class MyGcTextBoxCellType : GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
{
public override bool IsValid(object value)
{
String textVal = (String)value;
if (String.IsNullOrEmpty(textVal) == false)
{
while (textVal.EndsWith(Environment.NewLine, StringComparison.OrdinalIgnoreCase))
{
textVal = textVal.Substring(0, textVal.Length - Environment.NewLine.Length);
}
}
return base.IsValid(textVal);
}
public override Object Parse(String s)
{
String textVal = s;
string[] originalLines = GetLines(textVal);
string parsedText = base.Parse(textVal) as string;
string[] parsedLines = GetLines(parsedText);
if (originalLines.Length == parsedLines.Length)
{
return parsedText;
}
else
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0, length = originalLines.Length; i < length; i++)
{
if (i != 0)
stringBuilder.AppendLine();
stringBuilder.Append(parsedLines[i]);
}
return stringBuilder.ToString();
}
}
private string[] GetLines(string text)
{
List result = new List();
string[] lines = text.Split(new string[] { Environment.NewLine }, Int32.MaxValue, StringSplitOptions.None);
result.AddRange(lines);
return result.ToArray();
}
}
class MyGcTextBoxCellType : GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType
{
public override bool IsValid(object value)
{
String textVal = (String)value;
if (String.IsNullOrEmpty(textVal) == false)
{
while (textVal.EndsWith(Environment.NewLine, StringComparison.OrdinalIgnoreCase))
{
textVal = textVal.Substring(0, textVal.Length - Environment.NewLine.Length);
}
}
return base.IsValid(textVal);
}
public override Object Parse(String s)
{
String textVal = s;
string[] originalLines = GetLines(textVal);
string parsedText = base.Parse(textVal) as string;
string[] parsedLines = GetLines(parsedText);
if (originalLines.Length == parsedLines.Length)
{
return parsedText;
}
else
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0, length = originalLines.Length; i < length; i++)
{
if (i != 0)
stringBuilder.AppendLine();
stringBuilder.Append(parsedLines[i]);
}
return stringBuilder.ToString();
}
}
private string[] GetLines(string text)
{
List
string[] lines = text.Split(new string[] { Environment.NewLine }, Int32.MaxValue, StringSplitOptions.None);
result.AddRange(lines);
return result.ToArray();
}
}
// ※セル型を定義・設定している箇所
// GcTextBoxCellTypeクラスではなく、カスタムセルを使用します。
//var textCell = new GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType();
var textCell = new MyGcTextBoxCellType();
textCell.MaxLineCount = 4;
textCell.Multiline = true;
this.fpSpread1.ActiveSheet.Columns[0].CellType = textCell;
// GcTextBoxCellTypeクラスではなく、カスタムセルを使用します。
//var textCell = new GrapeCity.Win.Spread.InputMan.CellType.GcTextBoxCellType();
var textCell = new MyGcTextBoxCellType();
textCell.MaxLineCount = 4;
textCell.Multiline = true;
this.fpSpread1.ActiveSheet.Columns[0].CellType = textCell;
旧文書番号
82859