通常、行の追加はSheetViewクラスのAddRowsメソッド呼び出しによって行います。但しデータベースとの連結を行っている際に当メソッド呼び出しを行った場合、接続されているデータソースに対しても自動的に行が追加されるため、例えば「一意制約(主キーの設定)」や「NULL制約」を定義している場合には一般的なADO.NETの例外が発生する可能性もあります。
そのため、連結時に行を追加したい場合は、同クラスのAddUnboundRowsメソッド呼び出しによって一時的な非連結行を追加し、各フィールドに対して適切な値を入力後、やはり同クラスのAddRowToDataSourceメソッド呼び出しによってデータソースへの追加を行う必要があります。また、非連結行を追加することで小計行などを表示させることも可能となります。なお、行の連結状態は同クラスのIsRowBoundメソッド呼び出しによって取得できます。
当サンプルでは最終行に非連結行を追加し、各フィールドに値を設定した後にデーターソースへの追加を行う例を紹介します。
|
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