ASP.NET 2.0 の GridView の例: DataSource コントロールを使用したデータへのアクセス

 

ここをクリックして TOC に戻ります。

Web 開発者が直面する最も一般的なタスクの 1 つは、データの操作です。 データは、XML ファイルから、データベースから、またはデータ アクセス層として機能するクラスのセットなど、より抽象的なインターフェイスを介して提供される場合があります。 言うまでもなく、次のような日常的なデータ関連タスクに大量の時間が費やされます。

  • データ ストアからデータにアクセスするためのコードを記述する。
  • ユーザーの入力を受け取り、データ ストア内のデータを更新するコードを記述する。
  • データ ストアから 1 つ以上のレコードを削除するコードを記述する。

多くの場合、このデータ アクセス コードは非常に似ているので、日常的なコードと oft 繰り返しコードを記述します。 そして、退屈なコードを面白く退屈に書いているだけでなく、バグのレシピでもあります。 コードを切り取って貼り付ける場合は、貼り付けたコードの SQL 構文でテーブルまたは列名の変更を忘れる場合や、貼り付けたコードで NULL データを以前とは異なる方法で処理する必要があることを忘れる可能性があります。

これらの問題に対処するために、ASP.NET 2.0 では、新しいクラスのサーバー コントロール (データ ソース コントロール) が導入されています。 これらのコントロールは、さまざまなデータ ストアからのデータをカプセル化し、宣言構文を使用して完全に構成できます。つまり、ASP.NET 2.0 のデータにアクセスするには、コードをなめる必要はありません。 (もちろん、ASP.NET 1.x と同様に、ASP.NET 2.0 でプログラムによってデータ ストアにアクセスしたり変更したりできます)。

GridView と組み合わせて使用するメイン データ ソース コントロールは次のとおりです。

  • SqlDataSource — SQL 構文を理解するデータ ストアを介したデータ アクセスを提供します。 これには、Microsoft SQL Server、Microsoft Access、Oracle などのデータベースが含まれます。
  • ObjectDataSource — 開発者が作成したクラスを介したデータ アクセスを提供します。 (適切に設計された Web アプリケーションには、多くの場合、基になるデータ ストアからデータを操作または取得するメソッドを提供するクラスのセットがあります。これらのクラスはカプセル化のレイヤーを提供し、基になるデータ ストアの詳細を非表示にします)。
  • XmlDataSource — XML ドキュメントを介したデータ アクセスを提供します。

しばらくすると、これらの DataSourceを使用してデータにアクセスする方法について説明します。 しかし、その前に、Web ページにデータを表示する場合、データへのアクセスはパズルの一部に過ぎません。 もう 1 つの部分ではデータが表示され、 そこで GridView コントロールが表示されます。 まず、ASP.NET ページに GridView を追加します。 次に、 GridView で表示するデータを指定する必要があります。 GridView コントロールは、ASP.NET 2.0 のすべてのデータ Web コントロールと同様に、DataSourceID プロパティを持ち、データを表示するデータ ソース コントロールの ID に設定できます。 GridViewDataSourceID を設定すると、GridView は既定で、データ ソース コントロールによって返されるすべてのレコードのすべてのフィールドを表示します。 この記事の後半では、表示する列をカスタマイズする方法、列の書式を設定する方法などを説明します。

SqlDataSource を使用したデータへのアクセス

ASP.NET ページにデータ ソース コントロールを追加するには、Visual Studio 2005 ツールボックスから適切な ASP.NET Web ページのデザイン ビューにドラッグします。 これを行うと、コントロールのスマート タグが表示され、"データ ソースの構成" という名前のオプションが表示されます。このオプションを選択すると、必要な情報の入力を求めるウィザードが起動します。

SqlDataSource の場合、最初の画面で、接続するデータ ストアの接続文字列を指定するように求められます (図 1 を参照)。 図 1 に示すドロップダウンには、アプリケーションの<Web.configファイルの connectionStrings> セクションに存在する接続文字列が含まれています。 接続文字列をまだ定義していない場合、または目的の接続文字列が表示されない場合は、[新規作成] ボタンをクリックして新しい接続文字列を作成できます。

Aa479341.gridview_fg01(en-us,MSDN.10).gif

図 1

既存の接続文字列を作成または選択すると、ウィザードの次のステージで、操作するデータを指定するように求められます (図 2 を参照)。 ドロップダウンからテーブルまたはビューを選択するか、返されるフィールドを選択するか、独自の SQL ステートメントまたはストアド プロシージャ名を指定して呼び出すことができます。 このウィンドウから WHERE 条件を指定して、返されるデータを制限したり、取得したデータの順序を指定したりすることもできます。 [詳細オプション] ボタンを使用すると、データを取得する SELECT ステートメントだけでなく、INSERT、UPDATE、DELETE ステートメントも作成するオプションが表示されます。 (この記事で後述する INSERT、UPDATE、DELETE ステートメントの作成について説明します)。

Aa479341.gridview_fg02(en-us,MSDN.10).gif

図 2

ウィザードの最後の手順では、データ ストアに対して指定された SELECT ステートメントを実行して、返されるデータを正確に確認できます。

これで SqlDataSource を構成できます。 SqlDataSource のウィザードをステップ実行した後、表示するデータを指定しました。 残っているのは、 GridView が入ってくるデータを表示することです。 まず、[ツールボックス] から [ASP.NET] ページに GridView コントロールをドラッグ アンド ドロップします。 Smart Tag によって、 GridViewDataSource を選択するように求められます。 追加した SqlDataSource を選択すると、マジックと同様に、 GridView にはデータ ソース コントロールによって返されるフィールドに対応する列が自動的に表示されます。

図 3 は、GridViewSqlDataSource に接続した後の ASP.NET Web ページのデザイン ビューを示しています。このビューは、Northwind データベースの Products テーブルの ProductID、ProductName、QuantityPerUnit、UnitPrice、UnitsInStock フィールドを返します。 図 4 は、ブラウザーで表示する場合のこの ASP.NET ページを示しています。

画像を拡大するには、ここをクリックしてください。

図 3 (図をクリックすると大きな画像が表示されます)

Aa479341.gridview_fg04(en-us,MSDN.10).gif

図 4

データ ソース コントロールには、他の ASP.NET コントロールと同様に、ASP.NET ページの HTML セクションに挿入される、対応する宣言型マークアップがあります。 次のマークアップは、図 4 に示すページの完全なマークアップを示しています。 データベースからのデータを表示するために、サーバー側コードを 1 行記述する必要がなかったことに注意してください。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="productsDataSource" Runat="server" 
          "SelectCommand="SELECT [ProductID], [ProductName], " & _
          "[QuantityPerUnit], [UnitPrice], [UnitsInStock] " & _
          "FROM [Products]"
            ConnectionString=
            "<%$ ConnectionStrings:NWConnectionString %>" 
                DataSourceMode="DataReader">
        </asp:SqlDataSource>
        <asp:GridView ID="productGridView" Runat="server" 
             DataSourceID="productsDataSource"
            DataKeyNames="ProductID" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField ReadOnly="True" 
                  HeaderText="ProductID" InsertVisible="False" 
                  DataField="ProductID"
                    SortExpression="ProductID"></asp:BoundField>
                <asp:BoundField HeaderText="ProductName" 
                  DataField="ProductName" 
                  SortExpression="ProductName"></asp:BoundField>
                <asp:BoundField HeaderText="QuantityPerUnit" 
                    DataField="QuantityPerUnit" 
                    SortExpression="QuantityPerUnit"></asp:BoundField>
                <asp:BoundField HeaderText="UnitPrice" 
                   DataField="UnitPrice" SortExpression="UnitPrice">
                </asp:BoundField>
                <asp:BoundField HeaderText="UnitsInStock" 
                  DataField="UnitsInStock" 
                  SortExpression="UnitsInStock"></asp:BoundField>
            </Columns>
        </asp:GridView>
    
    </div>
    </form>
</body>
</html>

ObjectDataSource を使用したデータへのアクセス

SqlDataSource コントロールを使用すると、ASP.NET ページには、データ アクセスに関連する特定の詳細が含まれます。 つまり、 SqlDataSource の宣言型構文に埋め込まれていると、接続文字列、SELECT、INSERT、UPDATEs、DELETEEs の SQL ステートメント、および SQL ステートメントの種類ごとのパラメーターの一覧への参照が見つかります。 この方法の欠点は、データ ストアの詳細を ASP.NET ページに厳密にバインドすることです。 データベースの基になるスキーマが変更された場合は、データ ストアの変更された部分に触れるすべての ASP.NET ページを変更する必要があります。 さらに、ASP.NET ページにデータ アクセス ロジックを配置すると、ページの複雑さが増します。 アプリケーション内のデータ ストアのスキーマは、プロジェクトを初めて使用する開発者にとっては大きく、特に扱いにくい場合があります。 データ アクセス ロジックを ASP.NET ページに接続することにより、これらの開発者は、ASP.NET ページを作成または変更するために、データ モデルとそのプログラムとの関係を深く理解している必要があります。

大規模な Web アプリケーションのより優れたアプローチは、アプリケーションのアーキテクチャを異なるレイヤーに分割することです。 通常、Web アプリケーションは 3 つのレイヤーに分かれています。

  1. ASP.NET Web ページを含むプレゼンテーション レイヤー。
  2. データ アクセス層 (DAL) は、プレゼンテーション レイヤーからの要求とバックエンド データ ストア レイヤーの間のフェリーとして機能するクラスで構成されます。
  3. Microsoft SQL Server データベースなどのデータ ストア レイヤー。

Data Access Layer (DAL) を設定した場合、ASP.NET 2.0 ObjectDataSource コントロールを使用して DAL から取得された情報をカプセル化できます。 ObjectDataSource を使用する場合は、次の 2 ビットの情報を指定する必要があります。

  1. データにアクセスするメソッドを含む DAL クラスの完全修飾型名。
  2. データへのアクセス、データの削除、データの更新、およびデータの挿入を行うメソッド名。

ObjectDataSource の使用方法を示すために、Northwind データベースと対話するための簡単な DAL を作成しました。 DAL はProductID、ProductName、QuantityPerUnit、UnitPrice、UnitsInStock の各プロパティを持つ Product クラスと、ProductDAL という名前のクラスで構成されます。このクラスには、Product インスタンスのリストを返す GetProducts() という静的メソッドが含まれています。 これらの 2 つのクラスを次に示します。

ProductProductDAL (Visual Basic)

Imports Microsoft.VisualBasic
Public Class Product
#Region "Private Member Variables"
    Private _productID As Integer
    Private _productName As String
    Private _quantityPerUnit As String
    'Consider making _unitPrice & _unitInStock nullable fields,
    'since they are NULL in the Northwind database.
    Private _unitPrice As Decimal
    Private _unitsInStock As Integer
#End Region
#Region "Constructors"
    Public Sub New()
    End Sub
    Public Sub New(ByVal productID As Integer, _
      ByVal productName As String, ByVal quantityPerUnit As String, _
      ByVal unitPrice As Decimal, ByVal unitsInStock As Integer)
        Me._productID = productID
        Me._productName = productName
        Me._quantityPerUnit = quantityPerUnit
        Me._unitPrice = unitPrice
        Me._unitsInStock = unitsInStock
    End Sub
#End Region
#Region "Public Properties"
    Public Property ProductID() As Integer
        Get
            Return _productID
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                Throw New ArgumentException("ProductID must be " & _
                  " greater than or equal to zero.")
            Else
                _productID = value
            End If
        End Set
    End Property
    Public Property ProductName() As String
        Get
            Return _productName
        End Get
        Set(ByVal value As String)
            _productName = value
        End Set
    End Property
    Public Property QuantityPerUnit() As String
        Get
            Return _quantityPerUnit
        End Get
        Set(ByVal value As String)
            _quantityPerUnit = value
        End Set
    End Property
    Public Property UnitPrice() As Decimal
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As Decimal)
            If value < 0 Then
                Throw New ArgumentException("UnitPrice must be " & _
                   "greater than or equal to zero.")
            Else
                _unitPrice = value
            End If
        End Set
    End Property
    Public Property UnitsInStock() As Integer
        Get
            Return _unitsInStock
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                Throw New ArgumentException("UnitsInStock must be " & _
                   "greater than or equal to zero.")
            Else
                _unitsInStock = value
            End If
        End Set
    End Property
#End Region
End Class
Imports Microsoft.VisualBasic
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Collections.Generic
Public Class ProductDAL
    Public Shared Function GetProducts() As List(Of Product)
        ' returns a list of Product instances based on the
        ' data in the Northwind Products table
        Dim sql As String = "SELECT ProductID, ProductName, " & _
           "QuantityPerUnit, UnitPrice, UnitsInStock FROM Products"
        Dim myConnection As New & _
          SqlConnection( ConfigurationManager.ConnectionStrings( & _
          "NWConnectionString").ConnectionString)
        Dim myCommand As New SqlCommand(sql, myConnection)
        myConnection.Open()
        Dim reader As SqlDataReader = & _
         myCommand.ExecuteReader(CommandBehavior.CloseConnection)
        Dim results As New List(Of Product)()
        While reader.Read()
            Dim product As New Product()
            product.ProductID = Convert.ToInt32(reader("ProductID"))
            product.ProductName = reader("ProductName").ToString()
            product.QuantityPerUnit = & _
              reader("QuantityPerUnit").ToString()
            If reader("UnitPrice").Equals(DBNull.Value) Then
                product.UnitPrice = 0
            Else
                product.UnitPrice = & _
                  Convert.ToDecimal(reader("UnitPrice"))
            End If
            If reader("UnitsInStock").Equals(DBNull.Value) Then
                product.UnitsInStock = 0
            Else
                product.UnitsInStock = & _
                  Convert.ToInt32(reader("UnitsInStock"))
            End If
            results.Add(product)
        End While
        reader.Close()
        myConnection.Close()
        Return results
    End Function
End Class

ProductProductDAL (C#)

using System;
/// <summary>
/// Summary description for Product
/// </summary>
public class Product
{
    #region Private Member Variables
    private int productID;
    private string productName;
    private string quantityPerUnit;
    // Consider making _unitPrice & _unitInStock nullable fields,
    // since they are NULL in the Northwind database.
    private decimal unitPrice;
    private int unitsInStock;
    #endregion
    #region Constructors
    public Product() { }
    public Product(int productID, string productName, 
      string quantityPerUnit, decimal unitPrice, int unitsInStock)
    {
        this.productID = productID;
        this.productName = productName;
        this.quantityPerUnit = quantityPerUnit;
        this.unitPrice = unitPrice;
        this.unitsInStock = unitsInStock;
    }
    #endregion
    #region Public Properties
    public int ProductID
    {
        get
        {
            return productID;
        }
        set
        {
            if (productID < 0)
                throw new ArgumentException(@"ProductID must be 
                  greater than or equal to zero.");
            else
                productID = value;
        }
    }
    public string ProductName
    {
        get
        {
            return productName;
        }
        set
        {
            productName = value;
        }
    }
    public string QuantityPerUnit
    {
        get
        {
            return quantityPerUnit;
        }
        set
        {
            quantityPerUnit = value;
        }
    }
    public decimal UnitPrice
    {
        get
        {
            return unitPrice;
        }
        set
        {
            if (unitPrice < 0)
                throw new ArgumentException(@"UnitPrice must be 
                 greater than or equal to zero.");
            else
                unitPrice = value;
        }
    }
    public int UnitsInStock
    {
        get
        {
            return unitsInStock;
        }
        set
        {
            if (unitsInStock < 0)
                throw new ArgumentException(@"UnitsInStock must 
                  be greater than or equal to zero.");
            else
                unitsInStock = value;
        }
    }
    #endregion
}
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
/// <summary>
/// Summary description for ProductDAL
/// </summary>
public class ProductDAL
{
    public static List<Product> GetProducts()
    {
        // returns a list of Product instances based on the
        // data in the Northwind Products table
        string sql = @"SELECT ProductID, ProductName, QuantityPerUnit, 
         UnitPrice, UnitsInStock FROM Products";
        using (SqlConnection myConnection = new 
          SqlConnection(ConfigurationManager.ConnectionStrings[
          "NWConnectionString"].ConnectionString))
        {
            SqlCommand myCommand = new SqlCommand(sql, myConnection);
            myConnection.Open();
            SqlDataReader reader = 
             myCommand.ExecuteReader(CommandBehavior.CloseConnection);
            List<Product> results = new List<Product>();
            while (reader.Read())
            {
                Product product = new Product();
                product.ProductID = 
                 Convert.ToInt32(reader["ProductID"]);
                product.ProductName = reader["ProductName"].ToString();
                product.QuantityPerUnit = 
                 reader["QuantityPerUnit"].ToString();
                if (reader["UnitPrice"].Equals(DBNull.Value))
                    product.UnitPrice = 0;
                else
                    product.UnitPrice = 
                      Convert.ToDecimal(reader["UnitPrice"]);
                if (reader["UnitsInStock"].Equals(DBNull.Value))
                    product.UnitsInStock = 0;
                else
                    product.UnitsInStock = 
                      Convert.ToInt32(reader["UnitsInStock"]);
                results.Add(product);
            }
            reader.Close();
            myConnection.Close();
            return results;
        }
    }
}

ソース コードでわかるように、GetProducts() メソッドは、SqlDataReader の Northwind データベースの Products テーブルから関連フィールドを取得し、取得した結果をループ処理して、それぞれの Product インスタンスを作成し、そのインスタンスを製品リストに追加します。 この List は、メソッドの末尾に返されます。 これらのクラス ファイルは、Web アプリケーションの /app_code ディレクトリに 配置する必要があります。 これにより、自動的にコンパイルされ、アプリケーション内の ASP.NET ページにアクセスできるようになります。

ASP.NET ページに DAL クラスのデータを表示するには、まず ObjectDataSource を ページに追加し、スマート タグの [データ ソースの構成] リンクをクリックします。 これにより、 SqlDataSource のようなウィザードが起動されますが、接続文字列のクエリを実行する代わりに、 ObjectDataSource のウィザードの手順 1 で、データを操作するためのメソッドを含むクラスを選択するように求められます (図 5 を参照)。 クラスを選択すると、ウィザードの 2 番目の手順で、データの選択、データの削除、データの更新、およびデータの挿入の方法を選択するように求められます。 データにアクセスするためのメソッドしかないため、データを選択するための GetProducts() メソッドを選択するだけで、削除、更新、挿入のメソッドは指定しないでください。 図 6 は、 ObjectDataSource のウィザードの 2 番目の手順を示しています。

Aa479341.gridview_fg05(en-us,MSDN.10).gif

図 5

Aa479341.gridview_fg06(en-us,MSDN.10).gif

図 6

ObjectDataSource からデータを選択する場合に必要な処理はこれですべてです。 この時点で、 ページに GridView を追加し、そのデータ ソースを先ほど構成した ObjectDataSource に設定できます。 ObjectDataSourceGridView の宣言型構文を次に示します。 SqlDataSource と同様に、DAL でオブジェクトによって返されるデータを表示するには、ASP.NET ページにソース コードは必要ありません。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ObjectDataSource ID="productsDataSource" 
            Runat="server" SelectMethod="GetProducts"
            TypeName="ProductDAL">
        </asp:ObjectDataSource>
        <asp:GridView ID="GridView1" Runat="server" 
           DataSourceID="productsDataSource">
        </asp:GridView>&nbsp;
    
    </div>
    </form>
</body>
</html>

図 7 は、ブラウザーを介して表示された場合に ObjectDataSource にバインドされた GridView のスクリーンショットを示しています。 GridView には、Product クラスの各パブリック プロパティの列を含む Products テーブルのすべてのレコードが表示されます。

Aa479341.gridview_fg07(en-us,MSDN.10).gif

図 7

XmlDataSource を使用したデータへのアクセス

従来のリレーショナル データベースに格納されているデータ、またはオブジェクトにカプセル化されたデータへのアクセスを提供するだけでなく、ASP.NET 2.0 では、XML でマークアップされたデータにアクセスするための XmlDataSource コントロールも提供されます。 XmlDataSource コントロールを使用する前に、まず、関連するデータを含む XML ファイルが必要です。 Northwind Products テーブル内のデータのサブセットを含む XML ファイルを作成しました。図 8 を参照してください。

Aa479341.gridview_fg08(en-us,MSDN.10).gif

図 8

他のすべてのデータ ソース コントロールと同様に、 XmlDataSource コントロールには、XML ファイルのデータを取得するために必要な詳細を求めるウィザードがあります。 ただし、他のデータ ソース管理ウィザードとは異なり、 XmlDataSource のウィザードには 1 つのステップしかありません。これは図 9 に示されています。

Aa479341.gridview_fg09(en-us,MSDN.10).gif

図 9

図 9 に示すように、ウィザードは 4 ビットの情報を要求し、最初の情報のみが必要です。

  1. 必要な XML ファイルへのパス。
  2. XML ファイルのスキーマを定義する XSD ファイルへのパス。 XmlDataSource ではスキーマ情報がまったく使用されないため、スキーマを指定する必要はありません。 ただし、データ Web コントロールには、スキーマ ファイルによって提供される型固有の情報が必要になる場合があります。
  3. XSL 変換ファイルへの省略可能なパス。 ファイル内の XML が必要な構造に準拠していない場合は、この XSL 変換ファイル設定を使用して変換を指定できます。
  4. 省略可能な XPath 式。 XmlDataSource によって返されるデータをフィルター処理するのに役立ちます。 既定では、XML ファイルの内容全体が XmlDataSource によって読み込まれます。 ただし、XPath 式を指定することで、取得する要素を制限できます。

図 9 に示すように、XML ファイルへのパスのみを指定しました。

XmlDataSource によって取得された XML データを表示するには、単に GridView をページにドロップし、追加した XmlDataSource にそのデータ ソースを設定します。 これを行うと、ASP.NET ページの宣言構文は次のようになります。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:XmlDataSource ID="productsDataSource" 
         Runat="server" DataFile="~/DisplayingData/XML/Products.xml">
        </asp:XmlDataSource>
        <asp:GridView ID="GridView1" Runat="server" 
          DataSourceID="productsDataSource" 
          AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField HeaderText="ProductID" 
                   DataField="ProductID" SortExpression="ProductID">
                </asp:BoundField>
                <asp:BoundField HeaderText="ProductName" 
                   DataField="ProductName"
                   SortExpression="ProductName">
                </asp:BoundField>
                <asp:BoundField HeaderText="QuantityPerUnit" 
                  DataField="QuantityPerUnit" 
                  SortExpression="QuantityPerUnit"></asp:BoundField>
                <asp:BoundField HeaderText="UnitPrice" 
                   DataField="UnitPrice" 
                   SortExpression="UnitPrice"></asp:BoundField>
                <asp:BoundField HeaderText="UnitsInStock" 
                   DataField="UnitsInStock" 
                   SortExpression="UnitsInStock"></asp:BoundField>
            </Columns>
        </asp:GridView>
    
    </div>
    </form>
</body>
</html>

Aa479341.gridview_fg10(en-us,MSDN.10).gif

図 10

XmlDataSourceGridViewにバインドできますが、前の例で示したように、XmlDataSourceTreeView コントロールや Menu コントロールなどの階層コントロールにバインドするのが一般的です。 また、XmlDataSource コントロールは読み取り専用のデータ ソースです。つまり、編集可能な GridView のバッキング ストアとして XmlDataSource を使用することはできません。

次のセクション: GridView の書式設定

© Microsoft Corporation. All rights reserved.