次の方法で共有


DataGrid クラス

スクロールできるグリッドに ADO.NET データを表示します。

この型のすべてのメンバの一覧については、DataGrid メンバ を参照してください。

System.Object
   System.MarshalByRefObject
      System.ComponentModel.Component
         System.Windows.Forms.Control
            System.Windows.Forms.DataGrid

Public Class DataGrid
   Inherits Control
   Implements ISupportInitialize
[C#]
public class DataGrid : Control, ISupportInitialize
[C++]
public __gc class DataGrid : public Control, ISupportInitialize
[JScript]
public class DataGrid extends Control implements ISupportInitialize

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

System.Windows.Forms.DataGrid は、子テーブルへの Web に似たリンクを表示します。リンクをクリックすると子テーブルへ移動できます。子テーブルが表示されると、[戻る] ボタンがキャプションに表示され、クリックすると親テーブルへ戻ることができます。親行からのデータは、キャプションの下と列ヘッダーの上に表示されます。[戻る] ボタンの右側にあるボタンをクリックすると、親行の情報を非表示にできます。

実行時に、 System.Windows.Forms.DataGrid のテーブルを表示するには、 SetDataBinding メソッドを使用して DataSource プロパティと DataMember プロパティを有効なデータ ソースに設定します。有効なデータ ソースを次に示します。

DataSet クラスの詳細については、 DataSet の作成および使用 のトピックを参照してください。

作成したグリッドで、ユーザーはデータを編集できるが、新しい行を追加できないようにするには、 DataView をデータ ソースとして使用し、 AllowNew プロパティを false に設定します。

データ ソースは BindingManagerBase オブジェクトによってさらに管理されます。データ ソースの各テーブルに対して、フォームの BindingContext から BindingManagerBase を返すことができます。たとえば、関連付けられた BindingManagerBase オブジェクトの Count プロパティを返すと、データ ソースによって格納された行の数を確認できます。

データを検証するには、データとそのイベントを表している、基になるオブジェクトを使用します。たとえば、データが DataSetDataTable から発生している場合は、 ColumnChanging イベントと RowChanging イベントを使用します。

メモ   列の数は GridColumnStylesCollection のメンバを追加または削除することでカスタマイズでき、行は列で並べ替えできるため、 RowNumber プロパティ値と ColumnNumber プロパティ値は、必ずしも DataTable 内の DataRow インデックスと DataColumn インデックスに対応しているとは限りません。このため、データを検証するには、これらのプロパティを Validating イベントで使用しないでください。

選択されているセルを確認するには、 CurrentCell プロパティを使用します。セルの行インデックスおよび列インデックス、または単一の DataGridCell を設定できる Item プロパティを使用して、任意のセルの値を変更します。ユーザーがいつ別のセルを選択するかを検出するには、 CurrentCellChanged イベントを監視します。

ユーザーがコントロールのどの部分をクリックしたかを確認するには、 MouseDown イベントの HitTest メソッドを使用します。 HitTest メソッドによって、クリックされた領域の列と行を格納している DataGrid.HitTestInfo オブジェクトが返されます。

実行時にコントロールの外観を管理するには、色とキャプションの属性を設定するために、 CaptionForeColorCaptionBackColorCaptionFont などのプロパティを使用できます。

さらに、表示された 1 つ以上のグリッドの外観を変更するには、 DataGridTableStyle オブジェクトを作成して、そのオブジェクトを TableStyles プロパティを通じてアクセスする GridTableStylesCollection に追加します。たとえば、 DataSource が 3 つの DataTable オブジェクトを格納している DataSet に設定されている場合は、3 つの DataGridTableStyle オブジェクトをコレクションの各テーブルに 1 つ追加できます。 DataTable を使用して各 DataGridTableStyle オブジェクトを同期するには、 DataGridTableStyleMappingNameDataTableTableName に設定します。オブジェクトの配列へのバインドの詳細については、 DataGridTableStyle.MappingName プロパティのトピックを参照してください。

テーブルのカスタマイズされたビューを作成するには、 DataGridTextBoxColumn クラスまたは DataGridBoolColumn クラスのインスタンスを作成し、 TableStyles プロパティを使用してアクセスされる GridTableStylesCollection にオブジェクトを追加します。このクラスは両方とも、 DataGridColumnStyle から継承します。各列スタイルに対して、 MappingName を、グリッドに表示する列の ColumnName に設定します。列を非表示にするには、 MappingName を有効な ColumnName 以外の値に設定します。

列のテキストの書式を指定するには、 DataGridTextBoxColumnFormat プロパティを、 日付と時刻の書式指定文字列 または 標準の数値書式指定文字列 の値のいずれかに設定します。

DataGrid をオブジェクトの厳密に型指定された配列にバインドするには、オブジェクトにパブリック プロパティが含まれている必要があります。このような配列を表示する DataGridTableStyle を作成するには、 DataGridTableStyle.MappingName プロパティを classname[] に設定します。なお、この classname は実際のクラス名で置き換えてください。また、 MappingName プロパティでは大文字と小文字が区別されます。例については、 MappingName プロパティのトピックを参照してください。

また、 DataGridArrayList にバインドできます。 ArrayList の特長は、複数の型のオブジェクトを格納できることです。ただし、 DataGrid はリスト内のすべての項目の型が 1 番目の項目の型と同じ場合に限り、リストにバインドできます。つまり、すべてのオブジェクトの型が同じであるか、リスト内の最初の項目と同じクラスからすべてのクラスが継承している必要があります。たとえば、リスト内の最初の項目が Control の場合、2 番目の項目は (Control から継承した) TextBox にできます。逆に、1 番目の項目が TextBox の場合、2 番目のオブジェクトが Control になることはできません。さらに、 ArrayList は、バインディングするときは、項目を含んでいる必要があります。空の ArrayList の場合、空のグリッドとなります。 ArrayList にバインディングするときは、 DataGridTableStyleMappingName を "ArrayList" (型の名前) に設定します。

DataGridTableStyle では、 System.Windows.Forms.DataGrid コントロールの設定をオーバーライドする、色とキャプションの属性を設定できます。ただし、これらのプロパティが設定されていない場合は、コントロールの設定には既定の設定が使用されます。 DataGridTableStyle プロパティでオーバーライドできるプロパティを次に示します。

各列の外観をカスタマイズするには、 DataGridColumnStyle オブジェクトを各 DataGridTableStyleGridColumnStyles プロパティを通じてアクセスする GridColumnStylesCollection に追加します。 DataTableDataColumn を使用して各 DataGridColumnStyle を同期するには、 MappingNameDataColumnColumnName に設定します。 DataGridColumnStyle を構築するときは、列データの表示方法を指定する書式指定文字列を設定することもできます。たとえば、テーブルに格納されている日付を列で表示するときに、短い日付書式を使用するように指定できます。

注意   必ず DataGridColumnStyle オブジェクトを作成して GridColumnStylesCollection に追加してから、 DataGridTableStyle オブジェクトを GridTableStylesCollection に追加します。空の DataGridTableStyle をコレクションに追加すると、自動的に DataGridColumnStyle オブジェクトが生成されます。そのため、 MappingName 値が重複する新しい DataGridColumnStyle オブジェクトを GridColumnStylesCollection に追加しようとすると、例外がスローされます。

使用例

Windows フォーム、2 つの DataTable オブジェクトを格納する DataSet 、および 2 つのテーブルを関連付ける DataRelation を作成する例を次に示します。さらに、データを表示するために SetDataBinding メソッドを通じて、 System.Windows.Forms.DataGrid コントロールが DataSet にバインドされます。フォームのボタンを変更してグリッドの外観を変更するには、2 つの DataGridTableStyle オブジェクトを作成し、各オブジェクトの MappingNameDataTable オブジェクトのいずれかの TableName に設定します。この例では、 HitTest メソッドを使用して、列、行、およびクリックされているグリッドの部分を出力する MouseUp イベントのコードも示します。

 
Option Explicit
Option Strict

Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Windows.Forms

Public Class Form1
   Inherits System.Windows.Forms.Form
   Private components As System.ComponentModel.Container
   Private button1 As Button
   Private button2 As Button
   Private myDataGrid As DataGrid
   Private myDataSet As DataSet
   Private TablesAlreadyAdded As Boolean    
    
   Public Sub New()
      ' Required for Windows Form Designer support.
      InitializeComponent()
      ' Call SetUp to bind the controls.
      SetUp()
   End Sub 
        
  Private Sub InitializeComponent()
      ' Create the form and its controls.
      Me.components = New System.ComponentModel.Container()
      Me.button1 = New System.Windows.Forms.Button()
      Me.button2 = New System.Windows.Forms.Button()
      Me.myDataGrid = New DataGrid()
      
      Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
      Me.Text = "DataGrid Control Sample"
      Me.ClientSize = New System.Drawing.Size(450, 330)
        
      button1.Location = New Point(24, 16)
      button1.Size = New System.Drawing.Size(120, 24)
      button1.Text = "Change Appearance"
      AddHandler button1.Click, AddressOf button1_Click
        
      button2.Location = New Point(150, 16)
      button2.Size = New System.Drawing.Size(120, 24)
      button2.Text = "Get Binding Manager"
      AddHandler button2.Click, AddressOf button2_Click
        
      myDataGrid.Location = New Point(24, 50)
      myDataGrid.Size = New Size(300, 200)
      myDataGrid.CaptionText = "Microsoft DataGrid Control"
      AddHandler myDataGrid.MouseUp, AddressOf Grid_MouseUp
        
      Me.Controls.Add(button1)
      Me.Controls.Add(button2)
      Me.Controls.Add(myDataGrid)
   End Sub 
    
   Public Shared Sub Main()
      Application.Run(New Form1())
   End Sub 
        
   Private Sub SetUp()
      ' Create a DataSet with two tables and one relation.
      MakeDataSet()
      ' Bind the DataGrid to the DataSet. The dataMember
      ' specifies that the Customers table should be displayed.
      myDataGrid.SetDataBinding(myDataSet, "Customers")
   End Sub 
        
   Protected Sub button1_Click(sender As Object, e As System.EventArgs)
      If TablesAlreadyAdded = true then exit sub
        AddCustomDataTableStyle()
   End Sub 
   
   Private Sub AddCustomDataTableStyle()
      Dim ts1 As New DataGridTableStyle()
      ts1.MappingName = "Customers"
      ' Set other properties.
      ts1.AlternatingBackColor = Color.LightGray
      ' Add a GridColumnStyle and set its MappingName 
      ' to the name of a DataColumn in the DataTable. 
      ' Set the HeaderText and Width properties. 
        
      Dim boolCol As New DataGridBoolColumn()
      boolCol.MappingName = "Current"
      boolCol.HeaderText = "IsCurrent Customer"
      boolCol.Width = 150
      ts1.GridColumnStyles.Add(boolCol)
        
      ' Add a second column style.
      Dim TextCol As New DataGridTextBoxColumn()
      TextCol.MappingName = "custName"
      TextCol.HeaderText = "Customer Name"
      TextCol.Width = 250
      ts1.GridColumnStyles.Add(TextCol)
        
      ' Create the second table style with columns.
      Dim ts2 As New DataGridTableStyle()
      ts2.MappingName = "Orders"
        
      ' Set other properties.
      ts2.AlternatingBackColor = Color.LightBlue
        
      ' Create new ColumnStyle objects
      Dim cOrderDate As New DataGridTextBoxColumn()
      cOrderDate.MappingName = "OrderDate"
      cOrderDate.HeaderText = "Order Date"
      cOrderDate.Width = 100
      ts2.GridColumnStyles.Add(cOrderDate)

      ' Use a PropertyDescriptor to create a formatted
      ' column. First get the PropertyDescriptorCollection
      ' for the data source and data member. 
      Dim pcol As PropertyDescriptorCollection = _
      Me.BindingContext(myDataSet, "Customers.custToOrders"). _
      GetItemProperties()

      ' Create a formatted column using a PropertyDescriptor.
      ' The formatting character "c" specifies a currency format. */     
        
      Dim csOrderAmount As _
      New DataGridTextBoxColumn(pcol("OrderAmount"), "c", True)
      csOrderAmount.MappingName = "OrderAmount"
      csOrderAmount.HeaderText = "Total"
      csOrderAmount.Width = 100
      ts2.GridColumnStyles.Add(csOrderAmount)
        
      ' Add the DataGridTableStyle instances to 
      ' the GridTableStylesCollection. 
      myDataGrid.TableStyles.Add(ts1)
      myDataGrid.TableStyles.Add(ts2)

     ' Sets the TablesAlreadyAdded to true so this doesn't happen again.
      TablesAlreadyAdded = true
   End Sub 
    
   Protected Sub button2_Click(sender As Object, e As System.EventArgs)
      Dim bmGrid As BindingManagerBase
      bmGrid = BindingContext(myDataSet, "Customers")
      MessageBox.Show(("Current BindingManager Position: " & bmGrid.Position))
   End Sub 
        
   Private Sub Grid_MouseUp(sender As Object, e As MouseEventArgs)
      ' Create a HitTestInfo object using the HitTest method.
      ' Get the DataGrid by casting sender.
      Dim myGrid As DataGrid = CType(sender, DataGrid)
      Dim myHitInfo As DataGrid.HitTestInfo = myGrid.HitTest(e.X, e.Y)
      Console.WriteLine(myHitInfo)
      Console.WriteLine(myHitInfo.Type)
      Console.WriteLine(myHitInfo.Row)
      Console.WriteLine(myHitInfo.Column)
   End Sub 
        
   ' Create a DataSet with two tables and populate it.
   Private Sub MakeDataSet()
      ' Create a DataSet.
      myDataSet = New DataSet("myDataSet")
       
      ' Create two DataTables.
      Dim tCust As New DataTable("Customers")
      Dim tOrders As New DataTable("Orders")
      
      ' Create two columns, and add them to the first table.
      Dim cCustID As New DataColumn("CustID", GetType(Integer))
      Dim cCustName As New DataColumn("CustName")
      Dim cCurrent As New DataColumn("Current", GetType(Boolean))
      tCust.Columns.Add(cCustID)
      tCust.Columns.Add(cCustName)
      tCust.Columns.Add(cCurrent)
       
      ' Create three columns, and add them to the second table.
      Dim cID As New DataColumn("CustID", GetType(Integer))
      Dim cOrderDate As New DataColumn("orderDate", GetType(DateTime))
      Dim cOrderAmount As New DataColumn("OrderAmount", GetType(Decimal))
      tOrders.Columns.Add(cOrderAmount)
      tOrders.Columns.Add(cID)
      tOrders.Columns.Add(cOrderDate)
       
      ' Add the tables to the DataSet.
      myDataSet.Tables.Add(tCust)
      myDataSet.Tables.Add(tOrders)
        
      ' Create a DataRelation, and add it to the DataSet.
      Dim dr As New DataRelation("custToOrders", cCustID, cID)
      myDataSet.Relations.Add(dr)
        
      ' Populates the tables. For each customer and order, 
      ' creates two DataRow variables. 
      Dim newRow1 As DataRow
      Dim newRow2 As DataRow
        
      ' Create three customers in the Customers Table.
      Dim i As Integer
      For i = 1 To 3
         newRow1 = tCust.NewRow()
         newRow1("custID") = i
         ' Add the row to the Customers table.
         tCust.Rows.Add(newRow1)
      Next i
      ' Give each customer a distinct name.
      tCust.Rows(0)("custName") = "Customer1"
      tCust.Rows(1)("custName") = "Customer2"
      tCust.Rows(2)("custName") = "Customer3"
        
      ' Give the Current column a value.
      tCust.Rows(0)("Current") = True
      tCust.Rows(1)("Current") = True
      tCust.Rows(2)("Current") = False
        
      ' For each customer, create five rows in the Orders table.
      For i = 1 To 3
         Dim j As Integer
         For j = 1 To 5
            newRow2 = tOrders.NewRow()
            newRow2("CustID") = i
            newRow2("orderDate") = New DateTime(2001, i, j * 2)
            newRow2("OrderAmount") = i * 10 + j * 0.1
            ' Add the row to the Orders table.
            tOrders.Rows.Add(newRow2)
         Next j
      Next i
   End Sub 
End Class 

[C#] 
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form
{
   private System.ComponentModel.Container components;
   private Button button1;
   private Button button2;
   private DataGrid myDataGrid;   
   private DataSet myDataSet;
   private bool TablesAlreadyAdded;
   public Form1()
   {
      // Required for Windows Form Designer support.
      InitializeComponent();
      // Call SetUp to bind the controls.
      SetUp();
   }

   protected override void Dispose( bool disposing ){
      if( disposing ){
         if (components != null){
            components.Dispose();}
      }
      base.Dispose( disposing );
   }
   private void InitializeComponent()
   {
      // Create the form and its controls.
      this.components = new System.ComponentModel.Container();
      this.button1 = new System.Windows.Forms.Button();
      this.button2 = new System.Windows.Forms.Button();
      this.myDataGrid = new DataGrid();
      
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.Text = "DataGrid Control Sample";
      this.ClientSize = new System.Drawing.Size(450, 330);
      
      button1.Location = new Point(24, 16);
      button1.Size = new System.Drawing.Size(120, 24);
      button1.Text = "Change Appearance";
      button1.Click+=new System.EventHandler(button1_Click);

      button2.Location = new Point(150, 16);
      button2.Size = new System.Drawing.Size(120, 24);
      button2.Text = "Get Binding Manager";
      button2.Click+=new System.EventHandler(button2_Click);

      myDataGrid.Location = new  Point(24, 50);
      myDataGrid.Size = new Size(300, 200);
      myDataGrid.CaptionText = "Microsoft DataGrid Control";
      myDataGrid.MouseUp += new MouseEventHandler(Grid_MouseUp);
      
      this.Controls.Add(button1);
      this.Controls.Add(button2);
      this.Controls.Add(myDataGrid);
   }

   public static void Main()
   {
      Application.Run(new Form1());
   }
   
   private void SetUp()
   {
      // Create a DataSet with two tables and one relation.
      MakeDataSet();
      /* Bind the DataGrid to the DataSet. The dataMember
      specifies that the Customers table should be displayed.*/
      myDataGrid.SetDataBinding(myDataSet, "Customers");
   }

   protected void button1_Click(object sender, System.EventArgs e)
   {
      if(TablesAlreadyAdded) return;
      AddCustomDataTableStyle();
   }

   private void AddCustomDataTableStyle()
   {
      DataGridTableStyle ts1 = new DataGridTableStyle();
      ts1.MappingName = "Customers";
      // Set other properties.
      ts1.AlternatingBackColor = Color.LightGray;

      /* Add a GridColumnStyle and set its MappingName 
      to the name of a DataColumn in the DataTable. 
      Set the HeaderText and Width properties. */
      
      DataGridColumnStyle boolCol = new DataGridBoolColumn();
      boolCol.MappingName = "Current";
      boolCol.HeaderText = "IsCurrent Customer";
      boolCol.Width = 150;
      ts1.GridColumnStyles.Add(boolCol);
      
      // Add a second column style.
      DataGridColumnStyle TextCol = new DataGridTextBoxColumn();
      TextCol.MappingName = "custName";
      TextCol.HeaderText = "Customer Name";
      TextCol.Width = 250;
      ts1.GridColumnStyles.Add(TextCol);

      // Create the second table style with columns.
      DataGridTableStyle ts2 = new DataGridTableStyle();
      ts2.MappingName = "Orders";

      // Set other properties.
      ts2.AlternatingBackColor = Color.LightBlue;
      
      // Create new ColumnStyle objects
      DataGridColumnStyle cOrderDate = 
      new DataGridTextBoxColumn();
      cOrderDate.MappingName = "OrderDate";
      cOrderDate.HeaderText = "Order Date";
      cOrderDate.Width = 100;
      ts2.GridColumnStyles.Add(cOrderDate);

      /* Use a PropertyDescriptor to create a formatted
      column. First get the PropertyDescriptorCollection
      for the data source and data member. */
      PropertyDescriptorCollection pcol = this.BindingContext
      [myDataSet, "Customers.custToOrders"].GetItemProperties();
 
      /* Create a formatted column using a PropertyDescriptor.
      The formatting character "c" specifies a currency format. */     
      DataGridColumnStyle csOrderAmount = 
      new DataGridTextBoxColumn(pcol["OrderAmount"], "c", true);
      csOrderAmount.MappingName = "OrderAmount";
      csOrderAmount.HeaderText = "Total";
      csOrderAmount.Width = 100;
      ts2.GridColumnStyles.Add(csOrderAmount);

      /* Add the DataGridTableStyle instances to 
      the GridTableStylesCollection. */
      myDataGrid.TableStyles.Add(ts1);
      myDataGrid.TableStyles.Add(ts2);

     // Sets the TablesAlreadyAdded to true so this doesn't happen again.
     TablesAlreadyAdded=true;
   }

   protected void button2_Click(object sender, System.EventArgs e)
   {
      BindingManagerBase bmGrid;
      bmGrid = BindingContext[myDataSet, "Customers"];
      MessageBox.Show("Current BindingManager Position: " + bmGrid.Position);
   }

   private void Grid_MouseUp(object sender, MouseEventArgs e)
   {
      // Create a HitTestInfo object using the HitTest method.

      // Get the DataGrid by casting sender.
      DataGrid myGrid = (DataGrid)sender;
      DataGrid.HitTestInfo myHitInfo = myGrid.HitTest(e.X, e.Y);
      Console.WriteLine(myHitInfo);
      Console.WriteLine(myHitInfo.Type);
      Console.WriteLine(myHitInfo.Row);
      Console.WriteLine(myHitInfo.Column);
   }

   // Create a DataSet with two tables and populate it.
   private void MakeDataSet()
   {
      // Create a DataSet.
      myDataSet = new DataSet("myDataSet");
      
      // Create two DataTables.
      DataTable tCust = new DataTable("Customers");
      DataTable tOrders = new DataTable("Orders");

      // Create two columns, and add them to the first table.
      DataColumn cCustID = new DataColumn("CustID", typeof(int));
      DataColumn cCustName = new DataColumn("CustName");
      DataColumn cCurrent = new DataColumn("Current", typeof(bool));
      tCust.Columns.Add(cCustID);
      tCust.Columns.Add(cCustName);
      tCust.Columns.Add(cCurrent);

      // Create three columns, and add them to the second table.
      DataColumn cID = 
      new DataColumn("CustID", typeof(int));
      DataColumn cOrderDate = 
      new DataColumn("orderDate",typeof(DateTime));
      DataColumn cOrderAmount = 
      new DataColumn("OrderAmount", typeof(decimal));
      tOrders.Columns.Add(cOrderAmount);
      tOrders.Columns.Add(cID);
      tOrders.Columns.Add(cOrderDate);

      // Add the tables to the DataSet.
      myDataSet.Tables.Add(tCust);
      myDataSet.Tables.Add(tOrders);

      // Create a DataRelation, and add it to the DataSet.
      DataRelation dr = new DataRelation
      ("custToOrders", cCustID , cID);
      myDataSet.Relations.Add(dr);
   
      /* Populates the tables. For each customer and order, 
      creates two DataRow variables. */
      DataRow newRow1;
      DataRow newRow2;

      // Create three customers in the Customers Table.
      for(int i = 1; i < 4; i++)
      {
         newRow1 = tCust.NewRow();
         newRow1["custID"] = i;
         // Add the row to the Customers table.
         tCust.Rows.Add(newRow1);
      }
      // Give each customer a distinct name.
      tCust.Rows[0]["custName"] = "Customer1";
      tCust.Rows[1]["custName"] = "Customer2";
      tCust.Rows[2]["custName"] = "Customer3";

      // Give the Current column a value.
      tCust.Rows[0]["Current"] = true;
      tCust.Rows[1]["Current"] = true;
      tCust.Rows[2]["Current"] = false;

      // For each customer, create five rows in the Orders table.
      for(int i = 1; i < 4; i++)
      {
         for(int j = 1; j < 6; j++)
         {
            newRow2 = tOrders.NewRow();
            newRow2["CustID"]= i;
            newRow2["orderDate"]= new DateTime(2001, i, j * 2);
            newRow2["OrderAmount"] = i * 10 + j  * .1;
            // Add the row to the Orders table.
            tOrders.Rows.Add(newRow2);
         }
      }
   }
}

[C++] 
#using <mscorlib.dll>
#using <system.dll>
#using <system.data.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>
#using <system.xml.dll>

using namespace System;
using namespace System::ComponentModel;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Windows::Forms;

#define null 0

public __gc class Form1 : public System::Windows::Forms::Form {
private:
    System::ComponentModel::Container __gc *components;
    Button __gc *button1;
    Button __gc *button2;
    DataGrid __gc *myDataGrid;   
    DataSet __gc *myDataSet;
    bool TablesAlreadyAdded;
public:
    Form1() {
        // Required for Windows Form Designer support.
        InitializeComponent();
        // Call SetUp to bind the controls.
        SetUp();
    };

protected: //override 
    void Dispose(bool disposing) {
        if (disposing) {
            if (components != null) {
                components->Dispose();
            }
        }
        __super::Dispose(disposing);
    };
private:
    void InitializeComponent() {
        // Create the form and its controls.
        this->components = new System::ComponentModel::Container();
        this->button1 = new System::Windows::Forms::Button();
        this->button2 = new System::Windows::Forms::Button();
        this->myDataGrid = new DataGrid();
        this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
        this->Text = S"DataGrid Control Sample";
        this->ClientSize = System::Drawing::Size(450, 330);
      
        button1->Location = System::Drawing::Point(24, 16);
        button1->Size = System::Drawing::Size(120, 24);
        button1->Text = S"Change Appearance";
        button1->Click += new System::EventHandler(this, &Form1::button1_Click);

        button2->Location = System::Drawing::Point(150, 16);
        button2->Size = System::Drawing::Size(120, 24);
        button2->Text = S"Get Binding Manager";
        button2->Click += new System::EventHandler(this, &Form1::button2_Click);

        myDataGrid->Location = System::Drawing::Point(24, 50);
        myDataGrid->Size = System::Drawing::Size(300, 200);
        myDataGrid->CaptionText = S"Microsoft DataGrid Control";
        myDataGrid->MouseUp += new MouseEventHandler(this, &Form1::Grid_MouseUp);
      
        this->Controls->Add(button1);
        this->Controls->Add(button2);
        this->Controls->Add(myDataGrid);
    };

    void SetUp() {
        // Create a DataSet with two tables and one relation.
        MakeDataSet();
        /* Bind the DataGrid to the DataSet. The dataMember
        specifies that the Customers table should be displayed.*/
        myDataGrid->SetDataBinding(myDataSet, S"Customers");
    };

protected:
    void button1_Click(Object *sender, System::EventArgs *e) {
      if (TablesAlreadyAdded) return;
      AddCustomDataTableStyle();
    };

private:
    void AddCustomDataTableStyle() {
        DataGridTableStyle __gc *ts1 = new DataGridTableStyle();
        ts1->MappingName = S"Customers";
        // Set other properties.
        ts1->AlternatingBackColor = Color::LightGray;

        /* Add a GridColumnStyle and set its MappingName 
        to the name of a DataColumn in the DataTable. 
        Set the HeaderText and Width properties. */
      
        DataGridColumnStyle __gc *boolCol = new DataGridBoolColumn();
        boolCol->MappingName = S"Current";
        boolCol->HeaderText = S"IsCurrent Customer";
        boolCol->Width = 150;
        ts1->GridColumnStyles->Add(boolCol);
      
        // Add a second column style.
        DataGridColumnStyle __gc *TextCol = new DataGridTextBoxColumn();
        TextCol->MappingName = S"custName";
        TextCol->HeaderText = S"Customer Name";
        TextCol->Width = 250;
        ts1->GridColumnStyles->Add(TextCol);

        // Create the second table style with columns.
        DataGridTableStyle __gc *ts2 = new DataGridTableStyle();
        ts2->MappingName = S"Orders";

        // Set other properties.
        ts2->AlternatingBackColor = Color::LightBlue;
      
        // Create new ColumnStyle objects
        DataGridColumnStyle __gc *cOrderDate = new DataGridTextBoxColumn();
        cOrderDate->MappingName = S"OrderDate";
        cOrderDate->HeaderText = S"Order Date";
        cOrderDate->Width = 100;
        ts2->GridColumnStyles->Add(cOrderDate);

        /* Use a PropertyDescriptor to create a formatted
        column. First get the PropertyDescriptorCollection
        for the data source and data member. */
        PropertyDescriptorCollection __gc *pcol = this->BindingContext->get_Item(myDataSet, S"Customers.custToOrders")->GetItemProperties();
 
        /* Create a formatted column using a PropertyDescriptor.
        The formatting character "c" specifies a currency format. */     
        DataGridColumnStyle __gc *csOrderAmount = new DataGridTextBoxColumn(pcol->Item[S"OrderAmount"], S"c", true);
        csOrderAmount->MappingName = S"OrderAmount";
        csOrderAmount->HeaderText = S"Total";
        csOrderAmount->Width = 100;
        ts2->GridColumnStyles->Add(csOrderAmount);

        /* Add the DataGridTableStyle instances to 
        the GridTableStylesCollection. */
        myDataGrid->TableStyles->Add(ts1);
        myDataGrid->TableStyles->Add(ts2);

        // Sets the TablesAlreadyAdded to true so this doesn't happen again.
        TablesAlreadyAdded = true;
    };

protected:
    void button2_Click(Object *sender, System::EventArgs *e) {
        BindingManagerBase __gc *bmGrid;
        bmGrid = BindingContext->get_Item(myDataSet, S"Customers");
        MessageBox::Show(String::Concat(S"Current BindingManager Position: ", __box(bmGrid->Position))->ToString());
    };

private:
    void Grid_MouseUp(Object *sender, MouseEventArgs *e) {
        // Create a HitTestInfo object using the HitTest method.

        // Get the DataGrid by casting sender.
        DataGrid __gc *myGrid = dynamic_cast<DataGrid *>(sender);
        DataGrid::HitTestInfo __gc *myHitInfo = myGrid->HitTest(e->X, e->Y);
        Console::WriteLine(myHitInfo);
        Console::WriteLine(myHitInfo->Type);
        Console::WriteLine(myHitInfo->Row);
        Console::WriteLine(myHitInfo->Column);
    };

    // Create a DataSet with two tables and populate it.
    void MakeDataSet() {
        // Create a DataSet.
        myDataSet = new DataSet(S"myDataSet");
      
        // Create two DataTables.
        DataTable __gc *tCust = new DataTable(S"Customers");
        DataTable __gc *tOrders = new DataTable(S"Orders");

        // Create two columns, and add them to the first table.
        DataColumn __gc *cCustID = new DataColumn(S"CustID", __typeof(__int32));
        DataColumn __gc *cCustName = new DataColumn(S"CustName");
        DataColumn __gc *cCurrent = new DataColumn(S"Current", __typeof(bool));
        tCust->Columns->Add(cCustID);
        tCust->Columns->Add(cCustName);
        tCust->Columns->Add(cCurrent);

        // Create three columns, and add them to the second table.
        DataColumn __gc *cID = new DataColumn(S"CustID", __typeof(__int32));
        DataColumn __gc *cOrderDate = new DataColumn(S"orderDate", __typeof(DateTime));
        DataColumn __gc *cOrderAmount = new DataColumn(S"OrderAmount", __typeof(Decimal));
        tOrders->Columns->Add(cOrderAmount);
        tOrders->Columns->Add(cID);
        tOrders->Columns->Add(cOrderDate);

        // Add the tables to the DataSet.
        myDataSet->Tables->Add(tCust);
        myDataSet->Tables->Add(tOrders);

        // Create a DataRelation, and add it to the DataSet.
        DataRelation __gc *dr = new DataRelation(S"custToOrders", cCustID , cID);
        myDataSet->Relations->Add(dr);
   
        /* Populate the tables. For each customer and order, 
        create need two DataRow variables. */
        DataRow __gc *newRow1;
        DataRow __gc *newRow2;

        // Create three customers in the Customers Table.
        for (int i = 1; i < 4; i++) {
            newRow1 = tCust->NewRow();
            newRow1->Item[S"custID"] = __box(i);
            // Add the row to the Customers table.
            tCust->Rows->Add(newRow1);
        }
        // Give each customer a distinct name.
        tCust->Rows->Item[0]->Item[S"custName"] = S"Customer1";
        tCust->Rows->Item[1]->Item[S"custName"] = S"Customer2";
        tCust->Rows->Item[2]->Item[S"custName"] = S"Customer3";

        // Give the Current column a value.
        tCust->Rows->Item[0]->Item[S"Current"] = __box(true);
        tCust->Rows->Item[1]->Item[S"Current"] = __box(true);
        tCust->Rows->Item[2]->Item[S"Current"] = __box(false);

        // For each customer, create five rows in the Orders table.
        for (int i = 1; i < 4; i++) {
            for (int j = 1; j < 6; j++) {
                newRow2 = tOrders->NewRow();
                newRow2->Item[S"CustID"]= __box(i);
                newRow2->Item[S"orderDate"]= __box(DateTime(2001, i, j * 2));
                newRow2->Item[S"OrderAmount"] = __box(i * 10 + j  * .1);
                // Add the row to the Orders table.
                tOrders->Rows->Add(newRow2);
            }
        }
    };
};

int main() {
    Application::Run(new Form1());
}

[JScript] 
import System;
import System.ComponentModel;
import System.Data;
import System.Drawing;
import System.Windows.Forms;

public class Form1 extends System.Windows.Forms.Form
{
   private var components : System.ComponentModel.Container;
   private var button1 : Button;
   private var button2 : Button;
   private var myDataGrid : DataGrid;   
   private var myDataSet : DataSet;
   private var TablesAlreadyAdded : Boolean;
   public function Form1()
   {
      // Required for Windows Form Designer support.
      InitializeComponent();
      // Call SetUp to bind the controls.
      SetUp();
   }

   protected override function Dispose(disposing :  Boolean){
      if( disposing ){
         if (components != null){
            components.Dispose();}
      }
      super.Dispose( disposing );
   }
   private function InitializeComponent()
   {
      // Create the form and its controls.
      this.components = new System.ComponentModel.Container();
      this.button1 = new System.Windows.Forms.Button();
      this.button2 = new System.Windows.Forms.Button();
      this.myDataGrid = new DataGrid();
      
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.Text = "DataGrid Control Sample";
      this.ClientSize = new System.Drawing.Size(450, 330);
      
      button1.Location = new Point(24, 16);
      button1.Size = new System.Drawing.Size(120, 24);
      button1.Text = "Change Appearance";
      button1.add_Click(button1_Click);

      button2.Location = new Point(150, 16);
      button2.Size = new System.Drawing.Size(120, 24);
      button2.Text = "Get Binding Manager";
      button2.add_Click(button2_Click);

      myDataGrid.Location = new  Point(24, 50);
      myDataGrid.Size = new System.Drawing.Size(300, 200);
      myDataGrid.CaptionText = "Microsoft DataGrid Control";
      myDataGrid.add_MouseUp(Grid_MouseUp);
      
      this.Controls.Add(button1);
      this.Controls.Add(button2);
      this.Controls.Add(myDataGrid);
   }

   public static function Main()
   {
      Application.Run(new Form1());
   }
   
   private function SetUp()
   {
      // Create a DataSet with two tables and one relation.
      MakeDataSet();
      /* Bind the DataGrid to the DataSet. The dataMember
      specifies that the Customers table should be displayed.*/
      myDataGrid.SetDataBinding(myDataSet, "Customers");
   }

   protected function button1_Click(sender : Object, e : System.EventArgs)
   {
      if(TablesAlreadyAdded) return;
      AddCustomDataTableStyle();
   }

   private function AddCustomDataTableStyle()
   {
      var ts1 : DataGridTableStyle = new DataGridTableStyle();
      ts1.MappingName = "Customers";
      // Set other properties.
      ts1.AlternatingBackColor = Color.LightGray;

      /* Add a GridColumnStyle and set its MappingName 
      to the name of a DataColumn in the DataTable. 
      Set the HeaderText and Width properties. */
      
      var boolCol : DataGridColumnStyle = new DataGridBoolColumn();
      boolCol.MappingName = "Current";
      boolCol.HeaderText = "IsCurrent Customer";
      boolCol.Width = 150;
      ts1.GridColumnStyles.Add(boolCol);
      
      // Add a second column style.
      var TextCol : DataGridColumnStyle = new DataGridTextBoxColumn();
      TextCol.MappingName = "custName";
      TextCol.HeaderText = "Customer Name";
      TextCol.Width = 250;
      ts1.GridColumnStyles.Add(TextCol);

      // Create the second table style with columns.
      var ts2 : DataGridTableStyle = new DataGridTableStyle();
      ts2.MappingName = "Orders";

      // Set other properties.
      ts2.AlternatingBackColor = Color.LightBlue;
      
      // Create new ColumnStyle objects
      var cOrderDate : DataGridColumnStyle = 
      new DataGridTextBoxColumn();
      cOrderDate.MappingName = "OrderDate";
      cOrderDate.HeaderText = "Order Date";
      cOrderDate.Width = 100;
      ts2.GridColumnStyles.Add(cOrderDate);

      /* Use a PropertyDescriptor to create a formatted
      column. First get the PropertyDescriptorCollection
      for the data source and data member. */
      var pcol : PropertyDescriptorCollection = this.BindingContext
      [myDataSet, "Customers.custToOrders"].GetItemProperties();
 
      /* Create a formatted column import a PropertyDescriptor.
      The formatting character "c" specifies a currency format. */     
      var csOrderAmount : DataGridColumnStyle = 
      new DataGridTextBoxColumn(pcol["OrderAmount"], "c", true);
      csOrderAmount.MappingName = "OrderAmount";
      csOrderAmount.HeaderText = "Total";
      csOrderAmount.Width = 100;
      ts2.GridColumnStyles.Add(csOrderAmount);

      /* Add the DataGridTableStyle instances to 
      the GridTableStylesCollection. */
      myDataGrid.TableStyles.Add(ts1);
      myDataGrid.TableStyles.Add(ts2);

     // Sets the TablesAlreadyAdded to true so this doesn't happen again.
     TablesAlreadyAdded=true;
   }

   protected function button2_Click(sender : Object, e : System.EventArgs)
   {
      var bmGrid : BindingManagerBase;
      bmGrid = BindingContext[myDataSet, "Customers"];
      MessageBox.Show("Current BindingManager Position: " + bmGrid.Position);
   }

   private function Grid_MouseUp(sender : Object, e : MouseEventArgs)
   {
      // Create a HitTestInfo object import the HitTest method.

      // Get the DataGrid by casting sender.
      var myGrid : DataGrid = DataGrid(sender);
      var myHitInfo : DataGrid.HitTestInfo= myGrid.HitTest(e.X, e.Y);
      Console.WriteLine(myHitInfo);
      Console.WriteLine(myHitInfo.Type);
      Console.WriteLine(myHitInfo.Row);
      Console.WriteLine(myHitInfo.Column);
   }

   // Create a DataSet with two tables and populate it.
   private function MakeDataSet()
   {
      // Create a DataSet.
      myDataSet = new DataSet("myDataSet");
      
      // Create two DataTables.
      var tCust : DataTable = new DataTable("Customers");
      var tOrders : DataTable = new DataTable("Orders");

      // Create two columns, and add them to the first table.
      var cCustID : DataColumn = new DataColumn("CustID", int);
      var cCustName : DataColumn = new DataColumn("CustName");
      var cCurrent : DataColumn = new DataColumn("Current", Boolean);
      tCust.Columns.Add(cCustID);
      tCust.Columns.Add(cCustName);
      tCust.Columns.Add(cCurrent);

      // Create three columns, and add them to the second table.
      var cID : DataColumn = 
      new DataColumn("CustID", int);
      var cOrderDate : DataColumn = 
      new DataColumn("orderDate", DateTime);
      var cOrderAmount : DataColumn = 
      new DataColumn("OrderAmount", decimal);
      tOrders.Columns.Add(cOrderAmount);
      tOrders.Columns.Add(cID);
      tOrders.Columns.Add(cOrderDate);

      // Add the tables to the DataSet.
      myDataSet.Tables.Add(tCust);
      myDataSet.Tables.Add(tOrders);

      // Create a DataRelation, and add it to the DataSet.
      var dr : DataRelation = new DataRelation
      ("custToOrders", cCustID , cID);
      myDataSet.Relations.Add(dr);
   
      /* Populates the tables. For each customer and order, 
      creates two DataRow variables. */
      var newRow1 : DataRow;
      var newRow2 : DataRow;

      // Create three customers in the Customers Table.
      for(var x : int = 1; x < 4; x++)
      {
         newRow1 = tCust.NewRow();
         newRow1["custID"] = x;
         // Add the row to the Customers table.
         tCust.Rows.Add(newRow1);
      }
      // Give each customer a distinct name.
      tCust.Rows[0]["custName"] = "Customer1";
      tCust.Rows[1]["custName"] = "Customer2";
      tCust.Rows[2]["custName"] = "Customer3";

      // Give the Current column a value.
      tCust.Rows[0]["Current"] = true;
      tCust.Rows[1]["Current"] = true;
      tCust.Rows[2]["Current"] = false;

      // For each customer, create five rows in the Orders table.
      for(var i : int = 1; i < 4; i++)
      {
         for(var j : int = 1; j < 6; j++)
         {
            newRow2 = tOrders.NewRow();
            newRow2["CustID"]= i;
            newRow2["orderDate"]= new DateTime(2001, i, j * 2);
            newRow2["OrderAmount"] = i * 10 + j  * .1;
            // Add the row to the Orders table.
            tOrders.Rows.Add(newRow2);
         }
      }
   }
}

Form1.Main();

必要条件

名前空間: System.Windows.Forms

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)

参照

DataGrid メンバ | System.Windows.Forms 名前空間 | ADO.NET を使用したデータのアクセス | DataSet | DataView | DataTable | DataRow