方法: Windows フォーム コントロールを DBNull データベース値にバインドする

データ ソースに Windows フォーム コントロールをバインドして、データ ソースが DBNull 値を返す場合、イベントの処理、書式設定、または解析なしで、適切な値に置き換えることができます。 NullValue プロパティは、データ ソースの値を書式設定または解析する際、DBNull を指定されたオブジェクトに変換します。

次の例では、2 つの異なる状況で DBNull の値をバインドする方法を示しています。 1 つ目は、文字列のプロパティに対して NullValue を設定する方法を示し、2 つ目は、イメージのプロパティに対して NullValue を設定する方法を示します。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace DBNullCS
{
    public class Form1 : Form
    {
        public Form1()
        {		
            this.Load += new EventHandler(Form1_Load);
        }

        // The controls and components we need for the form.
        private Button button1;
        private PictureBox pictureBox1;
        private BindingSource bindingSource1;
        private TextBox textBox1;
        private TextBox textBox2;

        // Data table to hold the database data.
        DataTable employeeTable = new DataTable();

        void Form1_Load(object sender, EventArgs e)
        {
            // Basic form setup.
            this.pictureBox1 = new PictureBox();
            this.bindingSource1 = new BindingSource();
            this.textBox1 = new TextBox();
            this.textBox2 = new TextBox();
            this.button1 = new Button();
            this.pictureBox1.Location = new System.Drawing.Point(20, 20);
            this.pictureBox1.Size = new System.Drawing.Size(174, 179);
            this.textBox1.Location = new System.Drawing.Point(25, 215);
            this.textBox1.ReadOnly = true;
            this.textBox2.Location = new System.Drawing.Point(25, 241);
            this.textBox2.ReadOnly = true;
            this.button1.Location = new System.Drawing.Point(200, 103);
            this.button1.Text = "Move Next";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.pictureBox1);
            this.ResumeLayout(false);
            this.PerformLayout();

            // Create the connection string and populate the data table
            // with data.
            string connectionString = "Integrated Security=SSPI;" +
                "Persist Security Info = False;Initial Catalog=Northwind;" +
                "Data Source = localhost";
            SqlConnection connection = new SqlConnection();
            connection.ConnectionString = connectionString;
            SqlDataAdapter employeeAdapter =
                new SqlDataAdapter(new SqlCommand("Select * from Employees", connection));
            connection.Open();
            employeeAdapter.Fill(employeeTable);

            // Set the DataSource property of the BindingSource to the employee table.
            bindingSource1.DataSource = employeeTable;

           // Set up the binding to the ReportsTo column.
            Binding reportsToBinding = textBox2.DataBindings.Add("Text", bindingSource1,
                "ReportsTo", true);

            // Set the NullValue property for this binding.
            reportsToBinding.NullValue = "No Manager";

            // Set up the binding for the PictureBox using the Add method, setting
            // the null value in method call.
            pictureBox1.DataBindings.Add("Image", bindingSource1, "Photo", true,
                DataSourceUpdateMode.Never, new Bitmap(typeof(Button), "Button.bmp"));

            // Set up the remaining binding.
            textBox1.DataBindings.Add("Text", bindingSource1, "LastName", true);
        }

        // Move through the data when the button is clicked.
        private void button1_Click(object sender, EventArgs e)
        {
            bindingSource1.MoveNext();
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
}
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Data.SqlClient
Imports System.Windows.Forms



Public Class Form1
    Inherits Form
    
    Public Sub New() 
    End Sub
    
    ' The controls and components we need for the form.
    Private WithEvents button1 As Button
    Private pictureBox1 As PictureBox
    Private bindingSource1 As BindingSource
    Private textBox1 As TextBox
    Private textBox2 As TextBox
    
    ' Data table to hold the database data.
    Private employeeTable As New DataTable()
    
    
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
        Handles Me.Load

        ' Basic form setup.
        Me.pictureBox1 = New PictureBox()
        Me.bindingSource1 = New BindingSource()
        Me.textBox1 = New TextBox()
        Me.textBox2 = New TextBox()
        Me.button1 = New Button()
        Me.pictureBox1.Location = New System.Drawing.Point(20, 20)
        Me.pictureBox1.Size = New System.Drawing.Size(174, 179)
        Me.textBox1.Location = New System.Drawing.Point(25, 215)
        Me.textBox1.ReadOnly = True
        Me.textBox2.Location = New System.Drawing.Point(25, 241)
        Me.textBox2.ReadOnly = True
        Me.button1.Location = New System.Drawing.Point(200, 103)
        Me.button1.Text = "Move Next"
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Controls.Add(Me.button1)
        Me.Controls.Add(Me.textBox2)
        Me.Controls.Add(Me.textBox1)
        Me.Controls.Add(Me.pictureBox1)
        Me.ResumeLayout(False)
        Me.PerformLayout()

        ' Create the connection string and populate the data table
        ' with data.
        Dim connectionString As String = "Integrated Security=SSPI;" & _
            "Persist Security Info = False;Initial Catalog=Northwind;" _
            & "Data Source = localhost"
        Dim connection As New SqlConnection()
        connection.ConnectionString = connectionString
        Dim employeeAdapter As New SqlDataAdapter _
            (New SqlCommand("Select * from Employees", connection))
        connection.Open()
        employeeAdapter.Fill(employeeTable)

        ' Set the DataSource property of the BindingSource to the employee table.
        bindingSource1.DataSource = employeeTable

        ' Set up the binding to the ReportsTo column.
        Dim reportsToBinding As Binding = _
            textBox2.DataBindings.Add("Text", bindingSource1, "ReportsTo", _
                True)

        ' Set the NullValue property for this binding.
        reportsToBinding.NullValue = "No Manager"

        ' Set up the binding for the PictureBox using the Add method, setting
        ' the null value in method call.
        pictureBox1.DataBindings.Add("Image", bindingSource1, "Photo", _
            True, DataSourceUpdateMode.Never, _
            New Bitmap(GetType(Button), "Button.bmp"))

        ' Set up the remaining binding.
        textBox1.DataBindings.Add("Text", bindingSource1, "LastName", True)

    End Sub
    
    
    ' Move through the data when the button is clicked.
    Private Sub button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles button1.Click

        bindingSource1.MoveNext()

    End Sub
    
    
    <STAThread()>  _
    Shared Sub Main() 
        Application.EnableVisualStyles()
        Application.Run(New Form1())
    
    End Sub
End Class

バインドされたプロパティの種類と NullValue プロパティは同じにする必要があります。そうでないとエラーが発生し、NullValue の値はそれ以上処理されません。 このような場合は、例外はスローされません。

コードのコンパイル

この例で必要な要素は次のとおりです。

  • System、System.Data、System.Drawing、および System.Windows.Forms の各アセンブリへの参照。

関連項目