ホスト コントロールからのデータを使用してデータ ソースを更新する

ホスト コントロールをデータ ソースにバインドし、コントロール内のデータに加えられた変更でデータ ソースを更新することができます。 この処理には主に 2 つの手順があります。

  1. コントロールで変更されたデータを使用して、メモリ内データ ソースを更新します。 一般に、メモリ内データ ソースは DataSetDataTable、またはその他のデータ オブジェクトです。

  2. メモリ内データ ソースで変更されたデータを使用して、データベースを更新します。 これは、データ ソースが SQL Server や Microsoft Office Access データベースなどのバックエンド データベースに接続されている場合にのみ有効です。

    ホスト コントロールとデータ バインディングについて詳しくは、「ホスト項目とホスト コントロールの概要」および「Office ソリューションでコントロールにデータをバインドする」をご覧ください。

    対象: このトピックの情報は、Excel および Word のドキュメントレベルのプロジェクトおよび VSTO アドインのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

メモリ内データ ソースを更新する

既定では、単純データ バインディングを有効にしているホスト コントロール (Word 文書のコンテンツ コントロールや Excel ワークシートの名前付き範囲コントロールなど) は、データの変更内容をメモリ内データ ソースに保存しません。 つまり、エンド ユーザーがホスト コントロールの値に変更を加えてからコントロールの外に移動すると、コントロールの新しい値は自動的にはデータ ソースに保存されません。

データ ソースにデータを保存するには、実行時に特定のイベントに応答してデータ ソースを更新するコードを記述します。または、コントロールの値が変更されたときに自動的にデータ ソースを更新するようにコントロールを構成することもできます。

メモリ内データ ソースに ListObject の変更を保存する必要はありません。 ListObject コントロールをデータにバインドすると、 ListObject コントロールは追加のコードなしで変更内容を自動的にメモリ内データ ソースに保存します。

実行時にメモリ内データ ソースを更新するには

  • コントロールをデータ ソースにバインドする WriteValue オブジェクトの Binding メソッドを呼び出します。

    Excel ワークシートの NamedRange コントロールに加えられた変更をデータ ソースに保存する例を次に示します。 この例は、 NamedRange という名前の namedRange1 コントロールで Value2 プロパティがデータ ソースのフィールドにバインドされていることを前提としています。

    this.namedRange1.DataBindings["Value2"].WriteValue();
    

メモリ内データ ソースを自動更新する

メモリ内データ ソースを自動的に更新するように、コントロールを構成することもできます。 ドキュメント レベルのプロジェクトでこれを行うには、コードまたはデザイナーを使用します。 VSTO アドイン プロジェクトでは、コードを使用する必要があります。

コードを使用してメモリ内データ ソースを自動的に更新するようにコントロールを設定するには

  1. コントロールをデータソースにバインドする Binding オブジェクトの System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged モードを使用します。 データ ソースの更新には 2 つのオプションがあります。

    • コントロールの検証時にデータ ソースを更新するには、このプロパティを System.Windows.Forms.DataSourceUpdateMode.OnValidation に設定します。

    • コントロールのデータ バインド プロパティの値が変更されたときにデータ ソースを更新するには、このプロパティを System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged に設定します。

      Note

      System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged オプションは、Word ホスト コントロールには適用されません。Word では文書変更やコントロール変更の通知は提供されないためです。 ただし、Word 文書上の Windows フォーム コントロールには、このオプションを使用できます。

      コントロールの値が変わると自動的にデータ ソースを更新するように NamedRange コントロールを構成する例を次に示します。 この例は、 NamedRange という名前の namedRange1 コントロールで Value2 プロパティがデータ ソースのフィールドにバインドされていることを前提としています。

      this.namedRange1.DataBindings["Value2"].DataSourceUpdateMode = 
          DataSourceUpdateMode.OnPropertyChanged;
      

デザイナーを使用してメモリ内データ ソースを自動的に更新するようにコントロールを設定するには

  1. Visual Studio のデザイナーで、Word 文書または Excel ブックを開きます。

  2. データ ソースの自動更新を行うコントロールをクリックします。

  3. [プロパティ] ウィンドウで (DataBindings) プロパティを展開します。

  4. (Advanced) プロパティの横にある省略記号ボタン (VisualStudioEllipsesButton screenshot) をクリックします。

  5. [フォーマットと詳細バインド] ダイアログ ボックスで、 [データ ソース更新モード] ドロップダウン リストをクリックし、次の値のいずれかを選びます。

    • コントロールの検証時にデータ ソースを更新するには、 [OnValidation]を選びます。

    • コントロールのデータ バインド プロパティの値が変更されたときにデータ ソースを更新するには、 [OnPropertyChanged]を選びます。

      Note

      [OnPropertyChanged] オプションは、Word ホスト コントロールには適用されません。Word では文書変更やコントロール変更の通知は提供されないためです。 ただし、Word 文書上の Windows フォーム コントロールには、このオプションを使用できます。

  6. [フォーマットと詳細バインド] ダイアログ ボックスを閉じます。

データベースを更新する

メモリ内データ ソースがデータベースに関連付けられている場合、データ ソースへの変更内容を使用して、データベースを更新する必要があります。 データベースの更新について詳しくは、「データをデータベースに保存する」および「TableAdapter を使用してデータを更新する」をご覧ください。

データベースを更新するには

  1. コントロールの EndEditBindingSource メソッドを呼び出します。

    デザイン時に文書またはブックにデータ バインド コントロールを追加すると、 BindingSource が自動的に生成されます。 BindingSource によって、コントロールはプロジェクト内の型指定されたデータセットに接続されます。 詳しくは、「BindingSource コンポーネントの概要」をご覧ください。

    次のコード例は、プロジェクトに BindingSource という名前の customersBindingSourceが含まれていることを前提としています。

    this.customersBindingSource.EndEdit();
    
  2. プロジェクトで生成された TableAdapter の Update メソッドを呼び出します。

    TableAdapter は、デザイン時にデータ バインド コントロールを文書やブックに追加したときに、自動的に生成されます。 TableAdapter によって、プロジェクト内の型指定されたデータセットがデータベースに接続されます。 詳細については、TableAdapter の概要に関するページを参照してください。

    次のコード例では、Northwind データベースの Customers テーブルに接続していて、customersTableAdapter という名前の TableAdapter と、northwindDataSet という名前の型指定されたデータセットがプロジェクトに含まれていることを前提としています。

    this.customersTableAdapter.Update(this.northwindDataSet.Customers);