MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
行を追加する

通常、行の追加はSheetViewクラスのAddRowsメソッド呼び出しによって行います。但しデータベースとの連結を行っている際に当メソッド呼び出しを行った場合、接続されているデータソースに対しても自動的に行が追加されるため、例えば「一意制約(主キーの設定)」や「NULL制約」を定義している場合には一般的なADO.NETの例外が発生する可能性もあります。

そのため、連結時に行を追加したい場合は、同クラスのAddUnboundRowsメソッド呼び出しによって一時的な非連結行を追加し、各フィールドに対して適切な値を入力後、やはり同クラスのAddRowToDataSourceメソッド呼び出しによってデータソースへの追加を行う必要があります。また、非連結行を追加することで小計行などを表示させることも可能となります。なお、行の連結状態は同クラスのIsRowBoundメソッド呼び出しによって取得できます。

当サンプルでは最終行に非連結行を追加し、各フィールドに値を設定した後にデーターソースへの追加を行う例を紹介します。

【実行例】 非連結行の追加

非連結行の追加

  • 便宜上、当サンプルではデータセットを手動で作成しています。(DataSetの他にもDataTableやDataViewとの連結が可能です) SQL ServerやOracle等との接続に関する一般的な手法については各種参考文献をご参照ください。
  • 最終的なデータベースへの反映はDataAdapterのUpdateメソッド呼び出し等の対応が必要となります。また、テーブルの排他制御等についてもADO.NETの仕様に基づき適切に行う必要があります。詳細についてはMSDNライブラリをご参照ください。
  • DataRowのRowStateはセルデータの変更だけでは更新(Modified)されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。
  • 例えば既存行の間に新規行を追加した場合でも、データーソース上では常に 最終行の後に追加されます。(ADO.NETの仕様に準じます) そのため、データベース更新後に再接続(再表示)を行った場合は、必ずしも 追加した位置に新規行が表示される訳ではありませんので、あらかじめ注意が必要です。
  • データ連結時には関連データベースフィールドのデータに基づき、列のサイズ(幅)が自動的に設定されます。また、 列のセル型列ヘッダのテキストも自動的に変更されます。

    つまり、連結によって あらかじめデザイナにて設定された各種スタイル情報は全て無効となることに注意が必要です。このような場合は、以下の各プロパティ(SheetViewクラスメンバ)を必要に応じてFalse(デフォルトはTrue)に変更するか、連結後にコーディングによって各スタイル情報を設定する等の対応も必要となります。

    [DataAutoSizeColumns] : フィールドのデータに基づき、列のサイズを自動的に変更します
    [DataAutoCellTypes] : 各列のセル型を自動的に設定します
    [DataAutoHeadings] : 列ヘッダのテキストにするデータフィールド名を自動的に割り当てます

    また、階層表示における子階層(子ビュー)も同様の仕様となるため、この場合も必要に応じて上記変更を行う必要があります。具体的には子ビュー生成のタイミングで発生するChildViewCreatedイベントを実装し、ChildViewCreatedEventArgsクラスである引数eのSheetViewに対して変更を行います。

※出力例については本コンテンツ末尾を参照

 private DataTable DT = new DataTable();
 private DataSet DS = new DataSet();

 private void Form1_Load(object sender, System.EventArgs e)
 {

   //データセットを手動で作成します
   DT = DS.Tables.Add("SampleTable");
   DT.Columns.AddRange(new DataColumn[] {
               new DataColumn("ID", Type.GetType("System.Int32")),
               new DataColumn("Text", Type.GetType("System.String")),
               new DataColumn("Check", Type.GetType("System.Boolean"))
               });

   DT.Rows.Add(new object[] {10, "Text-10", true});
   DT.Rows.Add(new object[] {20, "Text-20", false});
   DT.Rows.Add(new object[] {30, "Text-30", false});
   DT.Rows.Add(new object[] {40, "Text-40", true});
   DT.Rows.Add(new object[] {50, "text-50", true});

   //データセットを接続します
   fpSpread1.DataSource = DS;

 }

 private void button1_Click(object sender, System.EventArgs e)
 {

   //最終行の後に非連結行を追加します
   fpSpread1.ActiveSheet.AddUnboundRows(fpSpread1.ActiveSheet.RowCount, 1);

   //データを設定します
   fpSpread1.ActiveSheet.SetValue(fpSpread1.ActiveSheet.RowCount - 1, 0, 100);
   fpSpread1.ActiveSheet.SetValue(fpSpread1.ActiveSheet.RowCount - 1, 1, "Text-New");
   fpSpread1.ActiveSheet.SetValue(fpSpread1.ActiveSheet.RowCount - 1, 2, true);
   fpSpread1.ActiveSheet.Rows[fpSpread1.ActiveSheet.RowCount - 1].BackColor = Color.LightPink;

 }

 private void button2_Click(object sender, System.EventArgs e)
 {

   Console.WriteLine("追加前のデータソース全行数:" + DT.Rows.Count.ToString());

   for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++)
   {
      if (fpSpread1.ActiveSheet.IsRowBound(i) != true)
         //非連結行のみをデーターソースに追加します
         fpSpread1.ActiveSheet.AddRowToDataSource(i, true);
   }

   Console.WriteLine("追加後のデータソース全行数:" + DT.Rows.Count.ToString());
   Console.WriteLine("データソースの最終行のTextフィールドの値は:" + DT.Rows[DT.Rows.Count - 1][1]);

 }
 Dim DT As New DataTable
 Dim DS As New DataSet

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

   'データセットを作成します
   DT = DS.Tables.Add("SampleTable")
   DT.Columns.AddRange(New DataColumn() { _
               New DataColumn("ID", Type.GetType("System.Int32")), _
               New DataColumn("Text", Type.GetType("System.String")), _
               New DataColumn("Check", Type.GetType("System.Boolean")) _
               })

   DT.Rows.Add(New Object() {10, "Text-10", True})
   DT.Rows.Add(New Object() {20, "Text-20", False})
   DT.Rows.Add(New Object() {30, "Text-30", False})
   DT.Rows.Add(New Object() {40, "Text-40", True})
   DT.Rows.Add(New Object() {50, "Text-50", True})

   'データセットを接続します
   FpSpread1.DataSource = DS

 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   '最終行の後に非連結行を追加します
   FpSpread1.ActiveSheet.AddUnboundRows(FpSpread1.ActiveSheet.RowCount, 1)

   'データを設定します
   FpSpread1.ActiveSheet.SetValue(FpSpread1.ActiveSheet.RowCount - 1, 0, 100)
   FpSpread1.ActiveSheet.SetValue(FpSpread1.ActiveSheet.RowCount - 1, 1, "Text-New")
   FpSpread1.ActiveSheet.SetValue(FpSpread1.ActiveSheet.RowCount - 1, 2, True)
   FpSpread1.ActiveSheet.Rows(FpSpread1.ActiveSheet.RowCount - 1).BackColor = Color.LightPink

 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

   Console.WriteLine("追加前のデータソース全行数:" + DT.Rows.Count.ToString)

   For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
      If Not FpSpread1.ActiveSheet.IsRowBound(i) Then
         '非連結行のみをデーターソースに追加します
         FpSpread1.ActiveSheet.AddRowToDataSource(i, True)
      End If
   Next

   Console.WriteLine("追加後のデータソース全行数:" + DT.Rows.Count.ToString)
   Console.WriteLine("データソースの最終行のTextフィールドの値は:" + DT.Rows(DT.Rows.Count - 1)(1))

 End Sub

出力例

追加前のデータソース全行数:5
追加後のデータソース全行数:6
データソースの最終行のTextフィールドの値は:Text-New

 

 


© MESCIUS inc. All rights reserved.