Copyright © GrapeCity inc. All rights reserved.
True DBGrid for WinForms
チュートリアル9: 任意のドロップダウンコントロールをグリッドセルに結び付ける
チュートリアル > チュートリアル9: 任意のドロップダウンコントロールをグリッドセルに結び付ける

このチュートリアルでは、任意のコントロールをグリッドセルからドロップダウンする方法を学びます。この例では、ユーザーがデータを簡単に入力できるように、定義済みの入力値を含む ListBox コントロールを使用します。たとえば、現在のセルをクリックして編集を始めると、このリストがドロップダウンされます。また、セル内にボタンを配置し、このボタンをクリックすることで ListBox コントロールを表示する方法を学びます。このチュートリアルで説明するテクニックと同様の方法で、グリッドセルから任意のコントロールをドロップダウンできます。

以下の手順を実行します。

  1. チュートリアル6: 連結グリッド内で非連結列を定義する で作成したプロジェクトから始めます。
  2. 次の図のように、フォームに ListBox コントロール(ListBox1)を追加します。
  3. ListBox1Visible プロパティを False に設定します。

コントロールをドロップダウンするためのコードの追加

グリッドの2列目(Column1)の CustType フィールドには、顧客タイプを表す次の1〜5の数値が表示されます。

ここでドロップダウンする ListBox1 には、テキストで表された顧客タイプの説明を表示し、ユーザーがアイテムの1つをダブルクリックして、対応する値をグリッドに入力できるようにします。

  1. Form1 の一般宣言セクションに次のコードを追加します。これらの名前空間を追加すると、後で記述するコードが簡潔になります。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Imports System.Data
    Imports System.Data.Oledb
    Imports System.IO
    Imports System.Collections
    

    C#コードの書き方

    C#
    コードのコピー
    using System.Data;
    using System.Data.Oledb;
    using System.IO;
    using System.Collections;
    
  2. Form1Load イベントに、ListBox1 に顧客タイプを追加するためのコードを置きます。また、 Buttonプロパティを使用して、顧客タイプ列にボタンを置きます。これで、Form1_Load イベントハンドラは次のようになります。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ContactsTableAdapter.Fill(Me.DsContacts.Contacts)
     
        ' リストボックスに顧客タイプの項目を追加します。
        With Me.ListBox1
            .Items.Add("Prospective")
            .Items.Add("Normal")
            .Items.Add("Buyer")
            .Items.Add("Distributor")
            .Items.Add("Other")
            .Visible = False
        End With
     
        ' 「顧客タイプ」にドロップダウンボタンを設定します。
        Me.C1TrueDBGrid1.Splits(0).DisplayColumns("CustType").Button = True
    End Sub
    

    C# コードの書き方

    C#
    コードのコピー
    private void Form1_Load(System.object sender,  System.EventArgs e) 
    {
        this.ContactsTableAdapter.Fill(this.DsContacts.Contacts);
     
        //リストボックスに顧客タイプの項目を追加します。
        this.listBox1.Items.Add("Prospective");
        this.listBox1.Items.Add("Normal");
        this.listBox1.Items.Add("Buyer");
        this.listBox1.Items.Add("Distributor");
        this.listBox1.Items.Add("Other");
        this.listBox1.Visible = false;
     
        //「顧客タイプ」にドロップダウンボタンを設定します。
        this.c1TrueDBGrid1.Splits[0].DisplayColumns["CustType"].Button = true;
    }
    
  3. 顧客タイプ列のセルが現在のセルになると、セルの右端にボタンが配置されます。このボタンをクリックすると、グリッドの ButtonClickイベントが発生します。ボタンがクリックされると、ListBox1がドロップダウンされるようにします。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Private Sub C1TrueDBGrid1_ButtonClick(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.ColEventArgs) Handles C1TrueDBGrid1.ButtonClick
        ' ドロップダウンとなるリストボックスをカレントセルの左端に配置します。
              With ListBox1
            .Left = Me.C1TrueDBGrid1.Left + Me.C1TrueDBGrid1.RecordSelectorWidth + Me.C1TrueDBGrid1.Splits(0).DisplayColumns(0).Width + Me.C1TrueDBGrid1.Splits(0).DisplayColumns(1).Width
            .Top = Me.C1TrueDBGrid1.Top + Me.C1TrueDBGrid1.RowTop(Me.C1TrueDBGrid1.Row)
            .Visible = True
            .Select()
        End With
    End Sub
    

    C# コードの書き方

    C#
    コードのコピー
    private void c1TrueDBGrid1_ButtonClick(object sender,  C1.Win.C1TrueDBGrid.ColEventArgs e) 
    {
    // ドロップダウンとなるリストボックスをカレントセルの左端に配置します。                                                     
        this.listBox1.Left = this.c1TrueDBGrid1.Left + this.c1TrueDBGrid1.RecordSelectorWidth + this.c1TrueDBGrid1.Splits[0].DisplayColumns[0].Width + this.c1TrueDBGrid1.Splits[0].DisplayColumns[1].Width;
        this.listBox1.Top = this.c1TrueDBGrid1.Top + this.c1TrueDBGrid1.RowTop(this.c1TrueDBGrid1.Row);
        this.listBox1.Visible = true;
        this.listBox1.Select();
    }
    
  4. ListBox1DoubleClick イベントに次のコードを追加します。このコードは、ListBox1 でアイテムが選択されたときに、そのアイテムのインデックスを C1TrueDBGrid1 内の適切な列にコピーし、ListBox1 を非表示にしています。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
        Me.C1TrueDBGrid1.Columns("CustType").Text = Me.ListBox1.SelectedIndex + 1
        Me.ListBox1.Visible = False
    End Sub
    

    C# コードの書き方

    C#
    コードのコピー
    private void listBox1_DoubleClick(object sender,  System.EventArgs e)  
    {
        this.c1TrueDBGrid1.Columns["CustType"].Text = (this.listBox1.SelectedIndex + 1).ToString();
        this.listBox1.Visible = false;
    }
    
  5. ListBox1Leave イベントに次のコードを追加します。このコードは、選択が行われたときに、リストボックスを非表示にしています。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Private Sub ListBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Leave
        Me.ListBox1.Visible = False
    End Sub
    

    C# コードの書き方

    C#
    コードのコピー
    private void listBox1_Leave(object sender,  System.EventArgs e) 
    {
        this.listBox1.Visible = false;
    }
    
  6. C1TrueDBGrid1Scrollイベントに次のコードを追加します。

    Visual Basic コードの書き方

    Visual Basic
    コードのコピー
    Private Sub C1TrueDBGrid1_Scroll(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.CancelEventArgs) Handles C1TrueDBGrid1.Scroll
        Me.ListBox1.Visible = False
    End Sub
    

    C# コードの書き方

    C#
    コードのコピー
    private void c1TrueDBGrid1_Scroll(object sender,  C1.Win.C1TrueDBGrid.CancelEventArgs e) 
    {
        this.listBox1.Visible = false;
    }
    

プログラムを実行し、次の動作を確認します。

これでチュートリアル 9 は終了です。