Практическое руководство. Привязка элементов управления Windows Forms к значениям DBNull
Если элементы управления Windows Forms привязаны к источнику данных и источник данных возвращает значение DBNull, соответствующее значение можно заменить без обработки, форматирования или анализа событий. Свойство NullValue преобразует DBNull в указанный объект при форматировании или анализе значений источника данных.
Пример
В примере ниже демонстрируется привязка значения DBNull в двух разных случаях. В первом случае показано, как задать NullValue для свойства строки; во втором — как задать 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.
См. также
.NET Desktop feedback