Gewusst wie: Binden von Daten an das MaskedTextBox-Steuerelement
Aktualisiert: November 2007
Daten lassen sich an ein MaskedTextBox-Steuerelement wie an jedes andere Windows Forms-Steuerelement binden. Wenn das Format der in der Datenbank enthaltenen Daten jedoch nicht mit dem von der Maskendefinition erwarteten Format übereinstimmt, müssen die Daten neu formatiert werden. Im folgenden Verfahren wird dies veranschaulicht. Dabei verwenden Sie das Format-Ereignis und das Parse-Ereignis der Binding-Klasse, um zwei separate Datenbankfelder für Telefonnummer und Durchwahl als einzelnes bearbeitbares Feld anzuzeigen.
Für das folgende Verfahren benötigen Sie Zugriff auf eine SQL Server-Datenbank mit installierter Beispieldatenbank Northwind.
So binden Sie Daten an ein MaskedTextBox-Steuerelement
Erstellen Sie ein neues Projekt vom Typ Windows Forms.
Ziehen Sie zwei TextBox-Steuerelemente auf das Formular, und nennen Sie diese FirstName und LastName.
Ziehen Sie ein MaskedTextBox-Steuerelement auf das Formular, und nennen Sie dieses PhoneMask.
Legen Sie die Mask-Eigenschaft von PhoneMask auf (000) 000-0000 x9999 fest.
Fügen Sie dem Formular folgende Namespaceimporte hinzu.
using System.Data.SqlClient;
Imports System.Data.SqlClient
Klicken Sie mit der rechten Maustaste auf das Formular, und wählen Sie Code anzeigen. Fügen Sie diesen Code an einer beliebigen Stelle in der Formularklasse ein.
Binding currentBinding, phoneBinding; DataSet employeesTable = new DataSet(); SqlConnection sc; SqlDataAdapter dataConnect; private void Form1_Load(object sender, EventArgs e) { DoMaskBinding(); } private void DoMaskBinding() { try { sc = new SqlConnection("Data Source=CLIENTUE;Initial Catalog=NORTHWIND;Integrated Security=SSPI"); sc.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } dataConnect = new SqlDataAdapter("SELECT * FROM Employees", sc); dataConnect.Fill(employeesTable, "Employees"); // Now bind MaskedTextBox to appropriate field. Note that we must create the Binding objects // before adding them to the control - otherwise, we won't get a Format event on the // initial load. try { currentBinding = new Binding("Text", employeesTable, "Employees.FirstName"); firstName.DataBindings.Add(currentBinding); currentBinding = new Binding("Text", employeesTable, "Employees.LastName"); lastName.DataBindings.Add(currentBinding); phoneBinding =new Binding("Text", employeesTable, "Employees.HomePhone"); // We must add the event handlers before we bind, or the Format event will not get called // for the first record. phoneBinding.Format += new ConvertEventHandler(phoneBinding_Format); phoneBinding.Parse += new ConvertEventHandler(phoneBinding_Parse); phoneMask.DataBindings.Add(phoneBinding); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } }
Dim WithEvents CurrentBinding, PhoneBinding As Binding Dim EmployeesTable As New DataSet() Dim sc As SqlConnection Dim DataConnect As SqlDataAdapter Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DoMaskedBinding() End Sub Private Sub DoMaskedBinding() Try sc = New SqlConnection("Data Source=SERVERNAME;Initial Catalog=NORTHWIND;Integrated Security=SSPI") sc.Open() Catch ex As Exception MessageBox.Show(ex.Message) Exit Sub End Try DataConnect = New SqlDataAdapter("SELECT * FROM Employees", sc) DataConnect.Fill(EmployeesTable, "Employees") ' Now bind MaskedTextBox to appropriate field. Note that we must create the Binding objects ' before adding them to the control - otherwise, we won't get a Format event on the ' initial load. Try CurrentBinding = New Binding("Text", EmployeesTable, "Employees.FirstName") firstName.DataBindings.Add(CurrentBinding) CurrentBinding = New Binding("Text", EmployeesTable, "Employees.LastName") lastName.DataBindings.Add(CurrentBinding) PhoneBinding = New Binding("Text", EmployeesTable, "Employees.HomePhone") PhoneMask.DataBindings.Add(PhoneBinding) Catch ex As Exception MessageBox.Show(ex.Message) Application.Exit() End Try End Sub
Fügen Sie Ereignishandler für das Format-Ereignis und das Parse-Ereignis hinzu, um die Felder PhoneNumber und Extension zu kombinieren und vom gebundenen DataSet zu trennen.
private void phoneBinding_Format(Object sender, ConvertEventArgs e) { String ext; DataRowView currentRow = (DataRowView)BindingContext[employeesTable, "Employees"].Current; if (currentRow["Extension"] == null) { ext = ""; } else { ext = currentRow["Extension"].ToString(); } e.Value = e.Value.ToString().Trim() + " x" + ext; } private void phoneBinding_Parse(Object sender, ConvertEventArgs e) { String phoneNumberAndExt = e.Value.ToString(); int extIndex = phoneNumberAndExt.IndexOf("x"); String ext = phoneNumberAndExt.Substring(extIndex).Trim(); String phoneNumber = phoneNumberAndExt.Substring(0, extIndex).Trim(); //Get the current binding object, and set the new extension manually. DataRowView currentRow = (DataRowView)BindingContext[employeesTable, "Employees"].Current; // Remove the "x" from the extension. currentRow["Extension"] = ext.Substring(1); //Return the phone number. e.Value = phoneNumber; }
Private Sub PhoneBinding_Format(ByVal sender As Object, ByVal e As ConvertEventArgs) Handles PhoneBinding.Format Dim Ext As String Dim CurrentRow As DataRowView = CType(Me.BindingContext(EmployeesTable, "Employees").Current, DataRowView) If (CurrentRow("Extension") Is Nothing) Then Ext = "" Else Ext = CurrentRow("Extension").ToString() End If e.Value = e.Value.ToString().Trim() & " x" & Ext End Sub Private Sub PhoneBinding_Parse(ByVal sender As Object, ByVal e As ConvertEventArgs) Handles PhoneBinding.Parse Dim PhoneNumberAndExt As String = e.Value.ToString() Dim ExtIndex As Integer = PhoneNumberAndExt.IndexOf("x") Dim Ext As String = PhoneNumberAndExt.Substring(ExtIndex).Trim() Dim PhoneNumber As String = PhoneNumberAndExt.Substring(0, ExtIndex).Trim() ' Get the current binding object, and set the new extension manually. Dim CurrentRow As DataRowView = CType(Me.BindingContext(EmployeesTable, "Employees").Current, DataRowView) ' Remove the "x" from the extension. CurrentRow("Extension") = CObj(Ext.Substring(1)) ' Return the phone number. e.Value = PhoneNumber End Sub
Fügen Sie dem Formular zwei Button-Steuerelemente hinzu. Nennen Sie diese previousButton und nextButton. Doppelklicken Sie auf jede Schaltfläche, um einen Click-Ereignishandler hinzuzufügen, und füllen Sie die Ereignishandler, wie im folgenden Codebeispiel veranschaulicht, mit Daten.
private void previousButton_Click(object sender, EventArgs e) { BindingContext[employeesTable, "Employees"].Position = BindingContext[employeesTable, "Employees"].Position - 1; } private void nextButton_Click(object sender, EventArgs e) { BindingContext[employeesTable, "Employees"].Position = BindingContext[employeesTable, "Employees"].Position + 1; }
Private Sub PreviousButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PreviousButton.Click Me.BindingContext(EmployeesTable, "Employees").Position = Me.BindingContext(EmployeesTable, "Employees").Position - 1 End Sub Private Sub NextButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextButton.Click Me.BindingContext(EmployeesTable, "Employees").Position = Me.BindingContext(EmployeesTable, "Employees").Position + 1 End Sub
Führen Sie das Beispiel aus. Bearbeiten Sie die Daten, und verwenden Sie die Schaltflächen Zurück und Weiter, um zu überprüfen, ob die Daten einwandfrei in DataSet übernommen wurden.
Beispiel
Beim folgenden Codebeispiel handelt es sich um die vollständige Codeauflistung, die sich aus der Ausführung des vorherigen Verfahrens ergibt.
Imports System.Data.SqlClient
Public Class Form1
Dim WithEvents CurrentBinding, PhoneBinding As Binding
Dim EmployeesTable As New DataSet()
Dim sc As SqlConnection
Dim DataConnect As SqlDataAdapter
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DoMaskedBinding()
End Sub
Private Sub DoMaskedBinding()
Try
sc = New SqlConnection("Data Source=localhost;Initial Catalog=NORTHWIND;Integrated Security=SSPI")
sc.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
Application.Exit()
End Try
DataConnect = New SqlDataAdapter("SELECT * FROM Employees", sc)
DataConnect.Fill(EmployeesTable, "Employees")
' Now bind MaskedTextBox to appropriate field. Note that we must create the Binding objects
' before adding them to the control - otherwise, we won't get a Format event on the
' initial load.
Try
CurrentBinding = New Binding("Text", EmployeesTable, "Employees.FirstName")
firstName.DataBindings.Add(CurrentBinding)
CurrentBinding = New Binding("Text", EmployeesTable, "Employees.LastName")
lastName.DataBindings.Add(CurrentBinding)
PhoneBinding = New Binding("Text", EmployeesTable, "Employees.HomePhone")
PhoneMask.DataBindings.Add(PhoneBinding)
Catch ex As Exception
MessageBox.Show(ex.Message)
Application.Exit()
End Try
End Sub
Private Sub PhoneBinding_Format(ByVal sender As Object, ByVal e As ConvertEventArgs) Handles PhoneBinding.Format
Dim Ext As String
Dim CurrentRow As DataRowView = CType(Me.BindingContext(EmployeesTable, "Employees").Current, DataRowView)
If (CurrentRow("Extension") Is Nothing) Then
Ext = ""
Else
Ext = CurrentRow("Extension").ToString()
End If
e.Value = e.Value.ToString().Trim() & " x" & Ext
End Sub
Private Sub PhoneBinding_Parse(ByVal sender As Object, ByVal e As ConvertEventArgs) Handles PhoneBinding.Parse
Dim PhoneNumberAndExt As String = e.Value.ToString()
Dim ExtIndex As Integer = PhoneNumberAndExt.IndexOf("x")
Dim Ext As String = PhoneNumberAndExt.Substring(ExtIndex).Trim()
Dim PhoneNumber As String = PhoneNumberAndExt.Substring(0, ExtIndex).Trim()
' Get the current binding object, and set the new extension manually.
Dim CurrentRow As DataRowView = CType(Me.BindingContext(EmployeesTable, "Employees").Current, DataRowView)
' Remove the "x" from the extension.
CurrentRow("Extension") = CObj(Ext.Substring(1))
' Return the phone number.
e.Value = PhoneNumber
End Sub
Private Sub NextButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextButton.Click
Me.BindingContext(EmployeesTable, "Employees").Position = Me.BindingContext(EmployeesTable, "Employees").Position + 1
End Sub
Private Sub PreviousButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PreviousButton.Click
Me.BindingContext(EmployeesTable, "Employees").Position = Me.BindingContext(EmployeesTable, "Employees").Position - 1
End Sub
End Class
#region Using directives
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SqlClient;
#endregion
namespace MaskedTextBoxDataCSharp
{
partial class Form1 : Form
{
Binding currentBinding, phoneBinding;
DataSet employeesTable = new DataSet();
SqlConnection sc;
SqlDataAdapter dataConnect;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DoMaskBinding();
}
private void DoMaskBinding()
{
try
{
sc = new SqlConnection("Data Source=localhost;Initial Catalog=NORTHWIND;Integrated Security=SSPI");
sc.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
dataConnect = new SqlDataAdapter("SELECT * FROM Employees", sc);
dataConnect.Fill(employeesTable, "Employees");
// Now bind MaskedTextBox to appropriate field. Note that we must create the Binding objects
// before adding them to the control - otherwise, we won't get a Format event on the
// initial load.
try
{
currentBinding = new Binding("Text", employeesTable, "Employees.FirstName");
firstName.DataBindings.Add(currentBinding);
currentBinding = new Binding("Text", employeesTable, "Employees.LastName");
lastName.DataBindings.Add(currentBinding);
phoneBinding =new Binding("Text", employeesTable, "Employees.HomePhone");
// We must add the event handlers before we bind, or the Format event will not get called
// for the first record.
phoneBinding.Format += new ConvertEventHandler(phoneBinding_Format);
phoneBinding.Parse += new ConvertEventHandler(phoneBinding_Parse);
phoneMask.DataBindings.Add(phoneBinding);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
private void phoneBinding_Format(Object sender, ConvertEventArgs e)
{
String ext;
DataRowView currentRow = (DataRowView)BindingContext[employeesTable, "Employees"].Current;
if (currentRow["Extension"] == null)
{
ext = "";
} else
{
ext = currentRow["Extension"].ToString();
}
e.Value = e.Value.ToString().Trim() + " x" + ext;
}
private void phoneBinding_Parse(Object sender, ConvertEventArgs e)
{
String phoneNumberAndExt = e.Value.ToString();
int extIndex = phoneNumberAndExt.IndexOf("x");
String ext = phoneNumberAndExt.Substring(extIndex).Trim();
String phoneNumber = phoneNumberAndExt.Substring(0, extIndex).Trim();
//Get the current binding object, and set the new extension manually.
DataRowView currentRow = (DataRowView)BindingContext[employeesTable, "Employees"].Current;
// Remove the "x" from the extension.
currentRow["Extension"] = ext.Substring(1);
//Return the phone number.
e.Value = phoneNumber;
}
private void previousButton_Click(object sender, EventArgs e)
{
BindingContext[employeesTable, "Employees"].Position = BindingContext[employeesTable, "Employees"].Position - 1;
}
private void nextButton_Click(object sender, EventArgs e)
{
BindingContext[employeesTable, "Employees"].Position = BindingContext[employeesTable, "Employees"].Position + 1;
}
}
}
Kompilieren des Codes
Erstellen Sie ein Visual C#- oder Visual Basic-Projekt.
Fügen Sie dem Formular das TextBox-Steuerelement und das MaskedTextBox-Steuerelement hinzu, wie im vorherigen Verfahren beschrieben.
Öffnen Sie die Quellcodedatei für das Standardformular des Projekts.
Ersetzen Sie den Quellcode in dieser Datei durch den im vorherigen "Code"-Abschnitt aufgelisteten Code.
Kompilieren Sie die Anwendung.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Arbeiten mit dem MaskedTextBox-Steuerelement