作成日: 2017/12/11 最終更新日: 2017/12/22
文書種別
不具合
状況
修正済み
詳細
DataAllowAddNewプロパティをTrueにして数式を設定すると、RemoveRowsメソッド呼び出し時に例外(System.IndexOutOfRangeException)が発生します。この現象はシートを再連結した後に発生します。
【再現手順】
1.新規フォームにSPREADを2つとButtonコントロールを配置します
2.サンプルコードをコピーしてアプリケーションを実行します
3.fpSpread1の3行目をクリックします
4.Buttonコントロールをクリックし行を削除します
-- 例外が発生します
【サンプルコード】
DataSet dataset = new DataSet();
DataTable dt1 = new DataTable( "Table1" );
DataTable dt2 = new DataTable( "Table10" );
DataTable dt3;
DataTable dt4;
private void Form1_Load(object sender, EventArgs e)
{
dt1.Columns.Add( "ID" );
dt1.Columns.Add( "件名" );
dt1.Columns.Add( "備考" );
dataset.Tables.Add( dt1 );
dt1.Rows.Add( "0001", "注文001", "a001");
dt1.Rows.Add( "0002", "注文002", "b002");
dt1.Rows.Add( "0003", "注文003", "c003");
dt2.Columns.Add( "ID" );
dt2.Columns.Add( "項目" );
dt2.Columns.Add( "注文数" );
dt2.Columns.Add( "単価" );
dt2.Columns.Add( "小計" );
dataset.Tables.Add( dt2 );
dt3 = dt2.Clone();
dt4 = dt2.Clone();
dt2.Rows.Add( "01", "製品001", "100", "50", "0");
dt2.Rows.Add( "02", "製品002", "200", "60", "0");
dt2.Rows.Add( "03", "製品003", "300", "70", "0");
dt3.Rows.Add( "04", "製品004", "400", "80", "0");
dt4.Rows.Add( "05", "製品005", "500", "90", "0");
dt4.Rows.Add( "06", "製品006", "600", "100", "0");
fpSpread1.ActiveSheet.DataSource = dt1;
fpSpread2.ActiveSheet.DataSource = dt2;
this.m_initSpreadForm();
}
private void button1_Click(object sender, EventArgs e)
{
fpSpread2.ActiveSheet.RemoveRows( fpSpread2.ActiveSheet.ActiveRowIndex, 1 );
}
private void fpSpread1_EnterCell(object sender, FarPoint.Win.Spread.EnterCellEventArgs e)
{
switch ( fpSpread1.ActiveSheet.ActiveRowIndex ) {
case 0 :
fpSpread2.ActiveSheet.DataSource = dt2;
break;
case 1 :
fpSpread2.ActiveSheet.DataSource = dt3;
break;
case 2 :
fpSpread2.ActiveSheet.DataSource = dt4;
break;
}
this.m_initSpreadForm();
}
private void m_initSpreadForm()
{
for ( int i=0; i<(fpSpread2.ActiveSheet.RowCount - 1); i++ ) {
string strWork = "C" + (i + 1) + "*" + "D" + (i + 1);
fpSpread2.ActiveSheet.SetFormula( i, 4, strWork );
}
}
【再現手順】
1.新規フォームにSPREADを2つとButtonコントロールを配置します
2.サンプルコードをコピーしてアプリケーションを実行します
3.fpSpread1の3行目をクリックします
4.Buttonコントロールをクリックし行を削除します
-- 例外が発生します
【サンプルコード】
DataSet dataset = new DataSet();
DataTable dt1 = new DataTable( "Table1" );
DataTable dt2 = new DataTable( "Table10" );
DataTable dt3;
DataTable dt4;
private void Form1_Load(object sender, EventArgs e)
{
dt1.Columns.Add( "ID" );
dt1.Columns.Add( "件名" );
dt1.Columns.Add( "備考" );
dataset.Tables.Add( dt1 );
dt1.Rows.Add( "0001", "注文001", "a001");
dt1.Rows.Add( "0002", "注文002", "b002");
dt1.Rows.Add( "0003", "注文003", "c003");
dt2.Columns.Add( "ID" );
dt2.Columns.Add( "項目" );
dt2.Columns.Add( "注文数" );
dt2.Columns.Add( "単価" );
dt2.Columns.Add( "小計" );
dataset.Tables.Add( dt2 );
dt3 = dt2.Clone();
dt4 = dt2.Clone();
dt2.Rows.Add( "01", "製品001", "100", "50", "0");
dt2.Rows.Add( "02", "製品002", "200", "60", "0");
dt2.Rows.Add( "03", "製品003", "300", "70", "0");
dt3.Rows.Add( "04", "製品004", "400", "80", "0");
dt4.Rows.Add( "05", "製品005", "500", "90", "0");
dt4.Rows.Add( "06", "製品006", "600", "100", "0");
fpSpread1.ActiveSheet.DataSource = dt1;
fpSpread2.ActiveSheet.DataSource = dt2;
this.m_initSpreadForm();
}
private void button1_Click(object sender, EventArgs e)
{
fpSpread2.ActiveSheet.RemoveRows( fpSpread2.ActiveSheet.ActiveRowIndex, 1 );
}
private void fpSpread1_EnterCell(object sender, FarPoint.Win.Spread.EnterCellEventArgs e)
{
switch ( fpSpread1.ActiveSheet.ActiveRowIndex ) {
case 0 :
fpSpread2.ActiveSheet.DataSource = dt2;
break;
case 1 :
fpSpread2.ActiveSheet.DataSource = dt3;
break;
case 2 :
fpSpread2.ActiveSheet.DataSource = dt4;
break;
}
this.m_initSpreadForm();
}
private void m_initSpreadForm()
{
for ( int i=0; i<(fpSpread2.ActiveSheet.RowCount - 1); i++ ) {
string strWork = "C" + (i + 1) + "*" + "D" + (i + 1);
fpSpread2.ActiveSheet.SetFormula( i, 4, strWork );
}
}
回避方法
Service Pack 2(v10.0.4006.2012)で修正済み。
Service Pack 2より前のバージョンでは次の回避方法が有効です。
------------------------------------------
データテーブルとの連結の前にシートのResetメソッドを呼び出しリセットすることで回避します。その後、DataAllowAddNewプロパティや数式を再設定します。
【サンプルコード】
private void fpSpread1_EnterCell(object sender, FarPoint.Win.Spread.EnterCellEventArgs e)
{
// シートのリセット
fpSpread2.Reset();
switch ( fpSpread1.ActiveSheet.ActiveRowIndex ) {
case 0 :
fpSpread2.ActiveSheet.DataSource = dt2;
break;
case 1 :
fpSpread2.ActiveSheet.DataSource = dt3;
break;
case 2 :
fpSpread2.ActiveSheet.DataSource = dt4;
break;
}
// DataAllowAddNewの再設定
fpSpread2.ActiveSheet.DataAllowAddNew = true;
this.m_initSpreadForm();
}
Service Pack 2より前のバージョンでは次の回避方法が有効です。
------------------------------------------
データテーブルとの連結の前にシートのResetメソッドを呼び出しリセットすることで回避します。その後、DataAllowAddNewプロパティや数式を再設定します。
【サンプルコード】
private void fpSpread1_EnterCell(object sender, FarPoint.Win.Spread.EnterCellEventArgs e)
{
// シートのリセット
fpSpread2.Reset();
switch ( fpSpread1.ActiveSheet.ActiveRowIndex ) {
case 0 :
fpSpread2.ActiveSheet.DataSource = dt2;
break;
case 1 :
fpSpread2.ActiveSheet.DataSource = dt3;
break;
case 2 :
fpSpread2.ActiveSheet.DataSource = dt4;
break;
}
// DataAllowAddNewの再設定
fpSpread2.ActiveSheet.DataAllowAddNew = true;
this.m_initSpreadForm();
}
旧文書番号
41436