次の方法で共有


方法 : ListObject コントロールに新規行が追加された場合にエラーを処理する

更新 : 2008 年 7 月

対象

このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。

ドキュメント レベルのプロジェクト

  • Excel 2007

  • Excel 2003

アプリケーション レベルのプロジェクト

  • Excel 2007

詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

ユーザーは、データにバインドされた ListObject コントロールに新しい行を追加できます。リスト オブジェクトとデータ ソースの関係が原因でルーチン エラーが発生することがあります。たとえば、ListObject に表示する列を対応付けることができますが、NULL 値を受け付けないフィールドなど、制約のある列を省略した場合は、行が作成されるたびにエラーが発生します。ErrorAddDataBoundRow イベントのイベント ハンドラに不足している値を追加するコードを記述できます。

データ バインド行を追加したときのエラーを処理するには

  1. ID と DataTable に使用する変数をクラス レベルで作成します。

    Dim id As Integer = 0
    Dim employeeTable As System.Data.DataTable
    
    private int id = 0;
    private System.Data.DataTable employeeTable;
    
  2. 新しい DataTable を作成し、サンプルの列とデータを Sheet1 クラス (ドキュメント レベルのプロジェクトの場合) または ThisAddIn クラス (アプリケーション レベルのプロジェクトの場合) の Startup イベント ハンドラに追加します。

    employeeTable = New System.Data.DataTable("Employees")
    
    Dim column As System.Data.DataColumn = employeeTable.Columns.Add("Id", GetType(Int32))
    column.AllowDBNull = False
    
    employeeTable.Columns.Add("FirstName", GetType(String))
    employeeTable.Columns.Add("LastName", GetType(String))
    employeeTable.Columns.Add("Age", GetType(Int32))
    
    employeeTable.Rows.Add(id, "Nancy", "Anderson", 56)
    employeeTable.Rows.Add(id, "Robert", "Brown", 44)
    id += 1
    
    list1.SetDataBinding(employeeTable, "", "FirstName", "LastName", "Age")
    
    employeeTable = new System.Data.DataTable("Employees");
    
    System.Data.DataColumn column = 
        employeeTable.Columns.Add("Id", typeof(int));
    column.AllowDBNull = false;
    
    employeeTable.Columns.Add("FirstName", typeof(string));
    employeeTable.Columns.Add("LastName", typeof(string));
    employeeTable.Columns.Add("Age", typeof(int));
    
    employeeTable.Rows.Add(id, "Nancy", "Anderson", "56");
    employeeTable.Rows.Add(id, "Robert", "Brown", "44");
    id++;
    
    list1.SetDataBinding(employeeTable, "", "FirstName", "LastName", "Age");
    
    list1.ErrorAddDataBoundRow += new Microsoft.Office.Tools.Excel.
        ErrorAddDataBoundRowEventHandler(list1_ErrorAddDataBoundRow);
    
  3. ErrorAddDataBoundRow イベントのイベント ハンドラで、インクリメントした次の ID 番号を ID フィールドに追加し、再び行を追加します。

    Private Sub list1_ErrorAddDataBoundRow(ByVal sender As Object, ByVal e As  _
        Microsoft.Office.Tools.Excel.ErrorAddDataBoundRowEventArgs) _
        Handles list1.ErrorAddDataBoundRow
    
        Dim row As System.Data.DataRow = (CType(e.Item, System.Data.DataRowView)).Row
    
        If TypeOf (e.InnerException) Is NoNullAllowedException Then
            row("Id") = id
            id += 1
            e.Retry = True
        End If
    End Sub
    
    private void list1_ErrorAddDataBoundRow(object sender,
        Microsoft.Office.Tools.Excel.ErrorAddDataBoundRowEventArgs e)
    {
        System.Data.DataRow row = ((System.Data.DataRowView)e.Item).Row;
    
        if (e.InnerException is NoNullAllowedException)
        {
            row["Id"]= id;
            id++;
            e.Retry = true;
        }
    }
    

コードのコンパイル方法

  • このコード例では、list1 という ListObject がワークシートに既にあり、そこにこのコードが表示されると仮定しています。

参照

処理手順

方法 : データに ListObject 列を割り当てる

方法 : ListObject コントロールに新規行が追加された場合にデータを検証する

概念

アプリケーション レベルのアドインにおける実行時の Word 文書や Excel ブックの拡張

Excel のアプリケーション レベルのアドインの開発

実行時の Office ドキュメントへのコントロールの追加

ListObject コントロール

ListObject 列と行順序の永続性について

その他の技術情報

Office ドキュメントのコントロール

Excel のホスト コントロール

変更履歴

[日付]

[履歴]

原因

2008 年 7 月

アプリケーション レベルのアドインで使用できる例を変更

SP1 機能変更